linux-hardened/drivers/platform/x86
Éric Piel 1510dd5954 lis3lv02d: avoid divide by zero due to unchecked
After an "unexpected" reboot, I found this Oops in my logs:

divide error: 0000 [#1] PREEMPT SMP=20
CPU 0=20
Modules linked in: lis3lv02d hp_wmi input_polldev [...]
Pid: 390, comm: modprobe Tainted: G         C  2.6.39-rc7-wl+=20
RIP: 0010:[<ffffffffa014b427>]  [<ffffffffa014b427>]
		 lis3lv02d_poweron+0x4e/0x94 [lis3lv02d]
RSP: 0018:ffff8801d6407cf8  EFLAGS: 00010246
RAX: 0000000000000bb8 RBX: ffffffffa014e000 RCX: 0000000000000000
RDX: 0000000000000000 RSI: ffffea00066e4708 RDI: ffff8801df002700
RBP: ffff8801d6407d18 R08: ffffea00066c5a30 R09: ffffffff812498c9
R10: ffff8801d7bfcea0 R11: ffff8801d7bfce10 R12: 0000000000000bb8
R13: 00000000ffffffda R14: ffffffffa0154120 R15: ffffffffa0154030
=46S:  00007fc0705db700(0000) GS:ffff8801dfa00000(0000) knlGS:0
CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
CR2: 00007f33549174f0 CR3: 00000001d65c9000 CR4: 00000000000406f0
Process modprobe (pid: 390, threadinfo ffff8801d6406000, task ffff8801d6b40=
000)
Stack:
 ffffffffa0154120 62ffffffa0154030 ffffffffa014e000 00000000ffffffea
 ffff8801d6407d58 ffffffffa014bcc1 0000000000000000 0000000000000048
 ffff8801d8bae800 00000000ffffffea 00000000ffffffda ffffffffa0154120
Call Trace:
 [<ffffffffa014bcc1>] lis3lv02d_init_device+0x1ce/0x496 [lis3lv02d]
 [<ffffffffa01522ff>] lis3lv02d_add+0x10f/0x17c [hp_accel]
 [<ffffffff81233e11>] acpi_device_probe+0x49/0x117
[...]
Code: 3a 75 06 80 4d ef 50 eb 04 80 4d ef 40 0f b6 55 ef be 21
00 00 00 48 89 df ff 53 18 44 8b 63 6c e8 3e fc ff ff 89 c1 44
89 e0 99 <f7> f9 89 c7 e8 93 82 ef e0 48 83 7b 30 00 74 2d 45
31 e4 80 7b=20
RIP  [<ffffffffa014b427>] lis3lv02d_poweron+0x4e/0x94 [lis3lv02d]
 RSP <ffff8801d6407cf8>

>From my POV, it looks like the hardware is not working as expected
and returns a bogus data rate. The driver doesn't check the result
and directly uses it as some sort of divisor in some places:

msleep(lis3->pwron_delay / lis3lv02d_get_odr());

Under this circumstances, this could very well cause the
"divide by zero" exception from above.

For now, I fixed it the easiest and most obvious way:
Check if the result is sane and if it isn't use a sane default
instead. I went for "100" in the latter case, simply because
/sys/devices/platform/lis3lv02d/rate returns it on a successful
boot.

Signed-off-by: Christian Lamparter <chunkeey@googlemail.com>
Signed-off-by: Éric Piel <eric.piel@tremplin-utc.net>
Cc: Matthew Garrett <mjg@redhat.com>
Cc: Witold Pilat <witold.pilat@gmail.com>
Cc: Lyall Pearce <lyall.pearce@hp.com>
Cc: Malte Starostik <m-starostik@versanet.de>
Cc: Ilkka Koskinen <ilkka.koskinen@nokia.com>
Cc: Thadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
Cc: Christian Lamparter <chunkeey@googlemail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2011-10-31 17:30:51 -07:00
..
acer-wmi.c acer-wmi: support Lenovo ideapad S205 wifi switch 2011-08-05 15:21:52 -04:00
acerhdf.c acerhdf.c: spaces in aliased changed to * 2011-08-05 15:21:51 -04:00
asus-laptop.c asus-wmi: add CWAP support and clarify the meaning of WAPF bits 2011-08-05 14:46:04 -04:00
asus-nb-wmi.c asus-wmi: add CWAP support and clarify the meaning of WAPF bits 2011-08-05 14:46:04 -04:00
asus-wmi.c asus-wmi: add uwb rfkill support 2011-08-05 14:46:07 -04:00
asus-wmi.h asus-wmi: add CWAP support and clarify the meaning of WAPF bits 2011-08-05 14:46:04 -04:00
asus_acpi.c asus: Add pr_fmt and convert printks to pr_<level> 2011-05-27 12:35:46 -04:00
classmate-laptop.c backlight: add backlight type 2011-03-22 17:43:59 -07:00
compal-laptop.c drivers/platform/x86: Fix memory leak 2011-07-07 10:39:03 -04:00
dell-laptop.c platform-drivers-x86: dell-laptop: Remove unneeded mutex_init() for buffer_mutex 2011-08-05 14:45:35 -04:00
dell-wmi-aio.c dell: Convert printks to pr_<level> 2011-05-27 12:35:47 -04:00
dell-wmi.c dell-wmi: Add keys for Dell XPS L502X 2011-08-05 15:21:47 -04:00
eeepc-laptop.c eeepc: Use pr_warn 2011-05-27 12:35:47 -04:00
eeepc-wmi.c asus-wmi: add CWAP support and clarify the meaning of WAPF bits 2011-08-05 14:46:04 -04:00
fujitsu-laptop.c fujitsu-laptop: Convert printks to pr_<level> 2011-05-27 12:35:47 -04:00
hdaps.c hdaps: Convert printks to pr_<level> 2011-05-27 12:35:48 -04:00
hp-wmi.c hp-wmi: fix use after free 2011-07-11 09:52:35 -04:00
hp_accel.c lis3lv02d: avoid divide by zero due to unchecked 2011-10-31 17:30:51 -07:00
ibm_rtl.c ibm_rtl: Use pr_fmt and pr_<level> 2011-05-27 12:35:49 -04:00
ideapad-laptop.c platform-drivers-x86: ideapad-laptop: add missing ideapad_input_exit in ideapad_acpi_add error path 2011-08-05 15:21:50 -04:00
intel_ips.c x86 driver: fix typo in TDP override enabling 2011-08-05 15:21:49 -04:00
intel_ips.h drm/i915, intel_ips: When i915 loads after IPS, make IPS relink to i915. 2010-12-23 09:51:36 +00:00
intel_menlow.c platform-drivers-x86: intel_menlow: add missing return AE_OK for intel_menlow_register_sensor() 2011-08-05 14:46:12 -04:00
intel_mid_powerbtn.c platform/x86: Simplify intel_mid_powerbtn 2011-05-27 12:36:46 -04:00
intel_mid_thermal.c platform-drivers-x86: intel_mid_thermal: fix memory leak 2011-08-05 14:46:11 -04:00
intel_oaktrail.c platform-drivers-x86: set backlight type to BACKLIGHT_PLATFORM 2011-07-07 11:27:17 -04:00
intel_pmic_gpio.c intel_pmic_gpio: Convert printks to pr_<level> 2011-05-27 12:35:50 -04:00
intel_rar_register.c platform-drivers-x86: intel_rar_register: convert to DEFINE_PCI_DEVICE_TABLE 2011-08-05 14:46:14 -04:00
intel_scu_ipc.c platform-drivers-x86: intel_scu_ipc: convert to DEFINE_PCI_DEVICE_TABLE 2011-08-05 14:46:15 -04:00
intel_scu_ipcutil.c intel_scu_ipcutils: Fix the license tag 2011-01-26 08:57:18 +10:00
Kconfig doc: fix broken references 2011-09-27 18:08:04 +02:00
Makefile Platform: Samsung Q10 backlight driver 2011-08-05 14:46:17 -04:00
msi-laptop.c msi-laptop: add MSI U270 netbook to module alias and scm list 2011-08-05 14:45:39 -04:00
msi-wmi.c platform-drivers-x86: msi-wmi: add missing sparse_keymap_free in msi_wmi_init error path 2011-08-05 14:46:10 -04:00
mxm-wmi.c mxm/wmi: add MXMX interface entry point. 2011-05-09 11:40:38 +10:00
panasonic-laptop.c backlight: add backlight type 2011-03-22 17:43:59 -07:00
samsung-laptop.c Platform: fix samsung-laptop DMI identification for N150/N210/220/N230 2011-08-05 15:21:48 -04:00
samsung-q10.c platform-drivers-x86: samsung-q10: make dmi_check_callback return 1 2011-08-05 15:21:47 -04:00
sony-laptop.c platform/x86:delete two unused variables 2011-05-27 12:38:25 -04:00
tc1100-wmi.c tc1100-wmi: Add pr_fmt, use pr_<level> 2011-05-27 12:35:51 -04:00
thinkpad_acpi.c thinkpad_acpi: Fix printk typo 'bluestooth' 2011-10-07 09:39:51 +02:00
topstar-laptop.c topstar-laptop: Convert remaining printk to pr_info 2011-05-27 12:35:52 -04:00
toshiba_acpi.c toshiba: Convert printks to pr_<level> 2011-05-27 12:35:52 -04:00
toshiba_bluetooth.c toshiba: Convert printks to pr_<level> 2011-05-27 12:35:52 -04:00
wmi.c wmi: Removed trailing whitespace from logging message. 2011-05-27 12:35:53 -04:00
xo1-rfkill.c Add OLPC XO-1 rfkill driver 2010-10-21 10:10:44 -04:00
xo15-ebook.c xo15-ebook: Use pr_<level> 2011-05-27 12:35:53 -04:00