From: Greg Kroah-Hartman Date: Wed, 3 Aug 2022 11:56:24 +0000 (+0200) Subject: 5.4-stable patches X-Git-Tag: v4.19.255~44 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=52e962bc0c23a2d6ce9f80061db4a25b590c8ecd;p=thirdparty%2Fkernel%2Fstable-queue.git 5.4-stable patches added patches: thermal-fix-null-pointer-dereferences-in-of_thermal_-functions.patch --- diff --git a/queue-5.4/series b/queue-5.4/series new file mode 100644 index 00000000000..e94a549ed6d --- /dev/null +++ b/queue-5.4/series @@ -0,0 +1 @@ +thermal-fix-null-pointer-dereferences-in-of_thermal_-functions.patch diff --git a/queue-5.4/thermal-fix-null-pointer-dereferences-in-of_thermal_-functions.patch b/queue-5.4/thermal-fix-null-pointer-dereferences-in-of_thermal_-functions.patch new file mode 100644 index 00000000000..a3f43542c86 --- /dev/null +++ b/queue-5.4/thermal-fix-null-pointer-dereferences-in-of_thermal_-functions.patch @@ -0,0 +1,87 @@ +From 96cfe05051fd8543cdedd6807ec59a0e6c409195 Mon Sep 17 00:00:00 2001 +From: Subbaraman Narayanamurthy +Date: Thu, 4 Nov 2021 16:57:07 -0700 +Subject: thermal: Fix NULL pointer dereferences in of_thermal_ functions + +From: Subbaraman Narayanamurthy + +commit 96cfe05051fd8543cdedd6807ec59a0e6c409195 upstream. + +of_parse_thermal_zones() parses the thermal-zones node and registers a +thermal_zone device for each subnode. However, if a thermal zone is +consuming a thermal sensor and that thermal sensor device hasn't probed +yet, an attempt to set trip_point_*_temp for that thermal zone device +can cause a NULL pointer dereference. Fix it. + + console:/sys/class/thermal/thermal_zone87 # echo 120000 > trip_point_0_temp + ... + Unable to handle kernel NULL pointer dereference at virtual address 0000000000000020 + ... + Call trace: + of_thermal_set_trip_temp+0x40/0xc4 + trip_point_temp_store+0xc0/0x1dc + dev_attr_store+0x38/0x88 + sysfs_kf_write+0x64/0xc0 + kernfs_fop_write_iter+0x108/0x1d0 + vfs_write+0x2f4/0x368 + ksys_write+0x7c/0xec + __arm64_sys_write+0x20/0x30 + el0_svc_common.llvm.7279915941325364641+0xbc/0x1bc + do_el0_svc+0x28/0xa0 + el0_svc+0x14/0x24 + el0_sync_handler+0x88/0xec + el0_sync+0x1c0/0x200 + +While at it, fix the possible NULL pointer dereference in other +functions as well: of_thermal_get_temp(), of_thermal_set_emul_temp(), +of_thermal_get_trend(). + +Suggested-by: David Collins +Signed-off-by: Subbaraman Narayanamurthy +Acked-by: Daniel Lezcano +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Mark-PK Tsai +Signed-off-by: Greg Kroah-Hartman +--- + drivers/thermal/of-thermal.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +--- a/drivers/thermal/of-thermal.c ++++ b/drivers/thermal/of-thermal.c +@@ -91,7 +91,7 @@ static int of_thermal_get_temp(struct th + { + struct __thermal_zone *data = tz->devdata; + +- if (!data->ops->get_temp) ++ if (!data->ops || !data->ops->get_temp) + return -EINVAL; + + return data->ops->get_temp(data->sensor_data, temp); +@@ -188,6 +188,9 @@ static int of_thermal_set_emul_temp(stru + { + struct __thermal_zone *data = tz->devdata; + ++ if (!data->ops || !data->ops->set_emul_temp) ++ return -EINVAL; ++ + return data->ops->set_emul_temp(data->sensor_data, temp); + } + +@@ -196,7 +199,7 @@ static int of_thermal_get_trend(struct t + { + struct __thermal_zone *data = tz->devdata; + +- if (!data->ops->get_trend) ++ if (!data->ops || !data->ops->get_trend) + return -EINVAL; + + return data->ops->get_trend(data->sensor_data, trip, trend); +@@ -336,7 +339,7 @@ static int of_thermal_set_trip_temp(stru + if (trip >= data->ntrips || trip < 0) + return -EDOM; + +- if (data->ops->set_trip_temp) { ++ if (data->ops && data->ops->set_trip_temp) { + int ret; + + ret = data->ops->set_trip_temp(data->sensor_data, trip, temp);