diff options
author | Henrik Rydberg <rydberg@euromail.se> | 2013-09-26 02:33:16 -0400 |
---|---|---|
committer | Guenter Roeck <linux@roeck-us.net> | 2013-09-26 06:48:43 -0400 |
commit | 5f4513864304672e6ea9eac60583eeac32e679f2 (patch) | |
tree | 65f6f8c23358a92b038a43475bd7715a5f1d05b0 | |
parent | 4b97280675f45c1650ee4e388bd711ecbb18c4b4 (diff) |
hwmon: (applesmc) Check key count before proceeding
After reports from Chris and Josh Boyer of a rare crash in applesmc,
Guenter pointed at the initialization problem fixed below. The patch
has not been verified to fix the crash, but should be applied
regardless.
Reported-by: <jwboyer@fedoraproject.org>
Suggested-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Henrik Rydberg <rydberg@euromail.se>
Cc: stable@vger.kernel.org
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
-rw-r--r-- | drivers/hwmon/applesmc.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c index 62c2e32e25ef..98814d12a604 100644 --- a/drivers/hwmon/applesmc.c +++ b/drivers/hwmon/applesmc.c | |||
@@ -525,16 +525,25 @@ static int applesmc_init_smcreg_try(void) | |||
525 | { | 525 | { |
526 | struct applesmc_registers *s = &smcreg; | 526 | struct applesmc_registers *s = &smcreg; |
527 | bool left_light_sensor, right_light_sensor; | 527 | bool left_light_sensor, right_light_sensor; |
528 | unsigned int count; | ||
528 | u8 tmp[1]; | 529 | u8 tmp[1]; |
529 | int ret; | 530 | int ret; |
530 | 531 | ||
531 | if (s->init_complete) | 532 | if (s->init_complete) |
532 | return 0; | 533 | return 0; |
533 | 534 | ||
534 | ret = read_register_count(&s->key_count); | 535 | ret = read_register_count(&count); |
535 | if (ret) | 536 | if (ret) |
536 | return ret; | 537 | return ret; |
537 | 538 | ||
539 | if (s->cache && s->key_count != count) { | ||
540 | pr_warn("key count changed from %d to %d\n", | ||
541 | s->key_count, count); | ||
542 | kfree(s->cache); | ||
543 | s->cache = NULL; | ||
544 | } | ||
545 | s->key_count = count; | ||
546 | |||
538 | if (!s->cache) | 547 | if (!s->cache) |
539 | s->cache = kcalloc(s->key_count, sizeof(*s->cache), GFP_KERNEL); | 548 | s->cache = kcalloc(s->key_count, sizeof(*s->cache), GFP_KERNEL); |
540 | if (!s->cache) | 549 | if (!s->cache) |