From: Zhang Rui Date: Wed, 12 Dec 2012 07:23:54 +0000 (+0800) Subject: Thermal: fix a NULL pointer dereference when generic thermal layer is built as a... X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=d567c686aebc7140f73318ee250236bda39c04eb;p=GitHub%2FLineageOS%2Fandroid_kernel_motorola_exynos9610.git Thermal: fix a NULL pointer dereference when generic thermal layer is built as a module [ 12.761956] BUG: unable to handle kernel NULL pointer dereference at 0000000000000018 [ 12.762016] IP: [] handle_thermal_trip+0x47/0x130 [thermal_sys] [ 12.762060] PGD 1fec74067 PUD 1fee5b067 PMD 0 [ 12.762127] Oops: 0000 [#1] SMP [ 12.762177] Modules linked in: hid_generic crc32c_intel usbhid hid firewire_ohci(+) e1000e(+) firewire_core crc_itu_t xhci_hcd(+) thermal(+) fan thermal_sys hwmon [ 12.762423] CPU 1 [ 12.762443] Pid: 187, comm: modprobe Tainted: G A 3.7.0-thermal-module+ #25 /DH77DF [ 12.762496] RIP: 0010:[] [] handle_thermal_trip+0x47/0x130 [thermal_sys] [ 12.762682] RSP: 0018:ffff8801fe7ddc18 EFLAGS: 00010282 [ 12.762704] RAX: 0000000000000000 RBX: ffff8801ff3e9c00 RCX: ffff8801fdc39800 [ 12.762728] RDX: ffff8801fe7ddc24 RSI: 0000000000000001 RDI: ffff8801ff3e9c00 [ 12.762764] RBP: ffff8801fe7ddc48 R08: 0000000004000000 R09: ffffffffa001f568 [ 12.762797] R10: ffffffff81363083 R11: 0000000000000001 R12: 0000000000000001 [ 12.762832] R13: 0000000000000000 R14: 0000000000000001 R15: ffff8801fde73e68 [ 12.762866] FS: 00007f5548516700(0000) GS:ffff88021f240000(0000) knlGS:0000000000000000 [ 12.762912] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 12.762946] CR2: 0000000000000018 CR3: 00000001fefe2000 CR4: 00000000001407e0 [ 12.762979] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [ 12.763014] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 [ 12.763048] Process modprobe (pid: 187, threadinfo ffff8801fe7dc000, task ffff8801fe5bdb40) [ 12.763095] Stack: [ 12.763122] 0000000000019640 00000000fdc39800 ffff8801fe7ddc48 ffff8801ff3e9c00 [ 12.763225] 0000000000000002 0000000000000000 ffff8801fe7ddc78 ffffffffa00053e7 [ 12.763338] ffff8801ff3e9c00 0000000000006c98 ffffffffa0007480 ffff8801ff3e9c00 [ 12.763440] Call Trace: [ 12.763470] [] thermal_zone_device_update+0x77/0xa0 [thermal_sys] [ 12.763515] [] thermal_zone_device_register+0x788/0xa88 [thermal_sys] [ 12.763562] [] acpi_thermal_add+0x360/0x4c8 [thermal] [ 12.763598] [] acpi_device_probe+0x50/0x190 [ 12.763632] [] ? sysfs_create_link+0x13/0x20 [ 12.763666] [] driver_probe_device+0x7b/0x240 [ 12.763699] [] __driver_attach+0xab/0xb0 [ 12.763732] [] ? driver_probe_device+0x240/0x240 [ 12.763766] [] bus_for_each_dev+0x56/0x90 [ 12.763799] [] driver_attach+0x1e/0x20 [ 12.763831] [] bus_add_driver+0x190/0x290 [ 12.763864] [] ? 0xffffffffa0021fff [ 12.763896] [] driver_register+0x7a/0x160 [ 12.763928] [] ? 0xffffffffa0021fff [ 12.763960] [] acpi_bus_register_driver+0x43/0x45 [ 12.763995] [] acpi_thermal_init+0x3a/0x42 [thermal] [ 12.764029] [] do_one_initcall+0x3f/0x170 [ 12.764063] [] sys_init_module+0x8f/0x200 [ 12.764097] [] system_call_fastpath+0x16/0x1b [ 12.764129] Code: 48 8b 87 c8 02 00 00 41 89 f4 48 8d 55 dc ff 50 28 44 8b 6d dc 41 8d 45 fe 83 f8 01 76 5e 48 8b 83 d8 02 00 00 44 89 e6 48 89 df 50 18 4c 8d a3 10 03 00 00 4c 89 e7 e8 87 f1 5e e1 8b 83 bc [ 12.765164] RIP [] handle_thermal_trip+0x47/0x130 [thermal_sys] [ 12.765223] RSP [ 12.765252] CR2: 0000000000000018 [ 12.765284] ---[ end trace 7723294cdfb00d2a ]--- This is because thermal_zone_device_update() is invoked before any thermal governors being registered. Signed-off-by: Zhang Rui --- diff --git a/drivers/thermal/thermal_sys.c b/drivers/thermal/thermal_sys.c index 8f0f37bb2825..8c8ce806180f 100644 --- a/drivers/thermal/thermal_sys.c +++ b/drivers/thermal/thermal_sys.c @@ -336,7 +336,8 @@ static void monitor_thermal_zone(struct thermal_zone_device *tz) static void handle_non_critical_trips(struct thermal_zone_device *tz, int trip, enum thermal_trip_type trip_type) { - tz->governor->throttle(tz, trip); + if (tz->governor) + tz->governor->throttle(tz, trip); } static void handle_critical_trips(struct thermal_zone_device *tz,