diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-09-07 16:03:48 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-09-07 16:03:48 -0400 |
| commit | 79016f648872549392d232cd648bd02298c2d2bb (patch) | |
| tree | 8b3f435b7ff3633b0a82313a1bb12d052f36c6b7 /kernel | |
| parent | e81b693c0104d6a767f998ee5a2e00b5acbbcd18 (diff) | |
| parent | 486257130873a2172d8eac2c182f7e578465bdd0 (diff) | |
Merge branch 'timers-fixes-for-linus' of git://tesla.tglx.de/git/linux-2.6-tip
* 'timers-fixes-for-linus' of git://tesla.tglx.de/git/linux-2.6-tip:
rtc: twl: Fix registration vs. init order
rtc: Initialized rtc_time->tm_isdst
rtc: Fix RTC PIE frequency limit
rtc: rtc-twl: Remove lockdep related local_irq_enable()
rtc: rtc-twl: Switch to using threaded irq
rtc: ep93xx: Fix 'rtc' may be used uninitialized warning
alarmtimers: Avoid possible denial of service with high freq periodic timers
alarmtimers: Memset itimerspec passed into alarm_timer_get
alarmtimers: Avoid possible null pointer traversal
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/time/alarmtimer.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c index 59f369f98a04..ea5e1a928d5b 100644 --- a/kernel/time/alarmtimer.c +++ b/kernel/time/alarmtimer.c | |||
| @@ -441,6 +441,8 @@ static int alarm_timer_create(struct k_itimer *new_timer) | |||
| 441 | static void alarm_timer_get(struct k_itimer *timr, | 441 | static void alarm_timer_get(struct k_itimer *timr, |
| 442 | struct itimerspec *cur_setting) | 442 | struct itimerspec *cur_setting) |
| 443 | { | 443 | { |
| 444 | memset(cur_setting, 0, sizeof(struct itimerspec)); | ||
| 445 | |||
| 444 | cur_setting->it_interval = | 446 | cur_setting->it_interval = |
| 445 | ktime_to_timespec(timr->it.alarmtimer.period); | 447 | ktime_to_timespec(timr->it.alarmtimer.period); |
| 446 | cur_setting->it_value = | 448 | cur_setting->it_value = |
| @@ -479,11 +481,17 @@ static int alarm_timer_set(struct k_itimer *timr, int flags, | |||
| 479 | if (!rtcdev) | 481 | if (!rtcdev) |
| 480 | return -ENOTSUPP; | 482 | return -ENOTSUPP; |
| 481 | 483 | ||
| 482 | /* Save old values */ | 484 | /* |
| 483 | old_setting->it_interval = | 485 | * XXX HACK! Currently we can DOS a system if the interval |
| 484 | ktime_to_timespec(timr->it.alarmtimer.period); | 486 | * period on alarmtimers is too small. Cap the interval here |
| 485 | old_setting->it_value = | 487 | * to 100us and solve this properly in a future patch! -jstultz |
| 486 | ktime_to_timespec(timr->it.alarmtimer.node.expires); | 488 | */ |
| 489 | if ((new_setting->it_interval.tv_sec == 0) && | ||
| 490 | (new_setting->it_interval.tv_nsec < 100000)) | ||
| 491 | new_setting->it_interval.tv_nsec = 100000; | ||
| 492 | |||
| 493 | if (old_setting) | ||
| 494 | alarm_timer_get(timr, old_setting); | ||
| 487 | 495 | ||
| 488 | /* If the timer was already set, cancel it */ | 496 | /* If the timer was already set, cancel it */ |
| 489 | alarm_cancel(&timr->it.alarmtimer); | 497 | alarm_cancel(&timr->it.alarmtimer); |
