diff options
author | Jiri Slaby <jslaby@suse.cz> | 2011-02-28 04:16:29 -0500 |
---|---|---|
committer | Wim Van Sebroeck <wim@iguana.be> | 2011-03-09 16:33:37 -0500 |
commit | d406577526a611e6be1f6b1cfeaf094dd95fa439 (patch) | |
tree | 9b4e97d33a9e18ce003eda0e3446dac9c6ec1828 /drivers/watchdog/sbc_fitpc2_wdt.c | |
parent | a5abba989deceb731047425812d268daf7536575 (diff) |
watchdog: sbc_fitpc2_wdt, fix crash on systems without DMI_BOARD_NAME
Some systems don't provide DMI_BOARD_NAME in their DMI tables. Avoid
crash in such situations in fitpc2_wdt_init.
The fix is to check if the dmi_get_system_info return value is NULL.
The oops:
BUG: unable to handle kernel NULL pointer dereference at (null)
IP: [<ffffffff81253ae6>] strstr+0x26/0xa0
PGD 3966e067 PUD 39605067 PMD 0
Oops: 0000 [#1] SMP
last sysfs file: /sys/devices/system/cpu/cpu1/cache/index2/shared_cpu_map
CPU 1
Modules linked in: ...
Pid: 1748, comm: modprobe Not tainted 2.6.37-22-default #1 /Bochs
RIP: 0010:[<ffffffff81253ae6>] [<ffffffff81253ae6>] strstr+0x26/0xa0
RSP: 0018:ffff88003ad73f18 EFLAGS: 00010206
RAX: 0000000000000000 RBX: 00000000ffffffed RCX: 00000000ffffffff
RDX: ffffffffa003f4cc RSI: ffffffffa003f4c2 RDI: 0000000000000000
...
CR2: 0000000000000000 CR3: 000000003b7ac000 CR4: 00000000000006e0
...
Process modprobe (pid: 1748, threadinfo ffff88003ad72000, task ffff88002e6365c0)
Stack: ...
Call Trace:
[<ffffffffa004201f>] fitpc2_wdt_init+0x1f/0x13c [sbc_fitpc2_wdt]
[<ffffffff810002da>] do_one_initcall+0x3a/0x170
...
Code: f3 c3 0f 1f 00 80 3e 00 53 48 89 f8 74 1b 48 89 f2 0f 1f 40 00 48 83 c2 01 80 3a 00 75 f7 49 89 d0 48 89 f8 49 29 f0 75 02 5b c3 <80> 3f 00 74 0e 0f 1f 44 00 00 48 83 c0 01 80 38 00 75 f7 49 89
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Signed-off-by: Wim Van Sebroeck <wim@iguana.be>
Diffstat (limited to 'drivers/watchdog/sbc_fitpc2_wdt.c')
-rw-r--r-- | drivers/watchdog/sbc_fitpc2_wdt.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/watchdog/sbc_fitpc2_wdt.c b/drivers/watchdog/sbc_fitpc2_wdt.c index c7d67e9a7465..79906255eeb6 100644 --- a/drivers/watchdog/sbc_fitpc2_wdt.c +++ b/drivers/watchdog/sbc_fitpc2_wdt.c | |||
@@ -201,11 +201,14 @@ static struct miscdevice fitpc2_wdt_miscdev = { | |||
201 | static int __init fitpc2_wdt_init(void) | 201 | static int __init fitpc2_wdt_init(void) |
202 | { | 202 | { |
203 | int err; | 203 | int err; |
204 | const char *brd_name; | ||
204 | 205 | ||
205 | if (!strstr(dmi_get_system_info(DMI_BOARD_NAME), "SBC-FITPC2")) | 206 | brd_name = dmi_get_system_info(DMI_BOARD_NAME); |
207 | |||
208 | if (!brd_name || !strstr(brd_name, "SBC-FITPC2")) | ||
206 | return -ENODEV; | 209 | return -ENODEV; |
207 | 210 | ||
208 | pr_info("%s found\n", dmi_get_system_info(DMI_BOARD_NAME)); | 211 | pr_info("%s found\n", brd_name); |
209 | 212 | ||
210 | if (!request_region(COMMAND_PORT, 1, WATCHDOG_NAME)) { | 213 | if (!request_region(COMMAND_PORT, 1, WATCHDOG_NAME)) { |
211 | pr_err("I/O address 0x%04x already in use\n", COMMAND_PORT); | 214 | pr_err("I/O address 0x%04x already in use\n", COMMAND_PORT); |