Commit c5161c68 authored by Phil Elwell's avatar Phil Elwell Committed by Greg Kroah-Hartman

thermal: bcm2835: Fix crash in bcm2835_thermal_debugfs

[ Upstream commit 35122495 ]

"cat /sys/kernel/debug/bcm2835_thermal/regset" causes a NULL pointer
dereference in bcm2835_thermal_debugfs. The driver makes use of the
implementation details of the thermal framework to retrieve a pointer
to its private data from a struct thermal_zone_device, and gets it
wrong - leading to the crash. Instead, store its private data as the
drvdata and retrieve the thermal_zone_device pointer from it.

Fixes: bcb7dd9e ("thermal: bcm2835: add thermal driver for bcm2835 SoC")
Signed-off-by: default avatarPhil Elwell <phil@raspberrypi.org>
Signed-off-by: default avatarZhang Rui <rui.zhang@intel.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 8fd403fc
...@@ -128,8 +128,7 @@ static const struct debugfs_reg32 bcm2835_thermal_regs[] = { ...@@ -128,8 +128,7 @@ static const struct debugfs_reg32 bcm2835_thermal_regs[] = {
static void bcm2835_thermal_debugfs(struct platform_device *pdev) static void bcm2835_thermal_debugfs(struct platform_device *pdev)
{ {
struct thermal_zone_device *tz = platform_get_drvdata(pdev); struct bcm2835_thermal_data *data = platform_get_drvdata(pdev);
struct bcm2835_thermal_data *data = tz->devdata;
struct debugfs_regset32 *regset; struct debugfs_regset32 *regset;
data->debugfsdir = debugfs_create_dir("bcm2835_thermal", NULL); data->debugfsdir = debugfs_create_dir("bcm2835_thermal", NULL);
...@@ -275,7 +274,7 @@ static int bcm2835_thermal_probe(struct platform_device *pdev) ...@@ -275,7 +274,7 @@ static int bcm2835_thermal_probe(struct platform_device *pdev)
data->tz = tz; data->tz = tz;
platform_set_drvdata(pdev, tz); platform_set_drvdata(pdev, data);
/* /*
* Thermal_zone doesn't enable hwmon as default, * Thermal_zone doesn't enable hwmon as default,
...@@ -299,8 +298,8 @@ static int bcm2835_thermal_probe(struct platform_device *pdev) ...@@ -299,8 +298,8 @@ static int bcm2835_thermal_probe(struct platform_device *pdev)
static int bcm2835_thermal_remove(struct platform_device *pdev) static int bcm2835_thermal_remove(struct platform_device *pdev)
{ {
struct thermal_zone_device *tz = platform_get_drvdata(pdev); struct bcm2835_thermal_data *data = platform_get_drvdata(pdev);
struct bcm2835_thermal_data *data = tz->devdata; struct thermal_zone_device *tz = data->tz;
debugfs_remove_recursive(data->debugfsdir); debugfs_remove_recursive(data->debugfsdir);
thermal_zone_of_sensor_unregister(&pdev->dev, tz); thermal_zone_of_sensor_unregister(&pdev->dev, tz);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment