diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-11 23:48:21 -0500 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-11 23:48:21 -0500 | 
| commit | 1e57c2186fc204ecd5e47f279d00eba3c3db245c (patch) | |
| tree | aad97e94afe668b2fe734ef28536627ec00860d8 /kernel | |
| parent | 756300983f11a1c6f9457d6d8f57354e0f0fe8d4 (diff) | |
| parent | ea5b41f9d595be354f7a50e56b28c2d72e6e88a5 (diff) | |
Merge branch 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  lockdep: Avoid out of bounds array reference in save_trace()
  futex: Take mmap_sem for get_user_pages in fault_in_user_writeable
  lockstat: Add usage info to Documentation/lockstat.txt
  lockstat: Fix min, max times in /proc/lock_stats
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/futex.c | 10 | ||||
| -rw-r--r-- | kernel/lockdep.c | 16 | 
2 files changed, 20 insertions, 6 deletions
| diff --git a/kernel/futex.c b/kernel/futex.c index fb65e822fc41..d73ef1f3e55d 100644 --- a/kernel/futex.c +++ b/kernel/futex.c | |||
| @@ -304,8 +304,14 @@ void put_futex_key(int fshared, union futex_key *key) | |||
| 304 | */ | 304 | */ | 
| 305 | static int fault_in_user_writeable(u32 __user *uaddr) | 305 | static int fault_in_user_writeable(u32 __user *uaddr) | 
| 306 | { | 306 | { | 
| 307 | int ret = get_user_pages(current, current->mm, (unsigned long)uaddr, | 307 | struct mm_struct *mm = current->mm; | 
| 308 | 1, 1, 0, NULL, NULL); | 308 | int ret; | 
| 309 | |||
| 310 | down_read(&mm->mmap_sem); | ||
| 311 | ret = get_user_pages(current, mm, (unsigned long)uaddr, | ||
| 312 | 1, 1, 0, NULL, NULL); | ||
| 313 | up_read(&mm->mmap_sem); | ||
| 314 | |||
| 309 | return ret < 0 ? ret : 0; | 315 | return ret < 0 ? ret : 0; | 
| 310 | } | 316 | } | 
| 311 | 317 | ||
| diff --git a/kernel/lockdep.c b/kernel/lockdep.c index f5dcd36d3151..4f8df01dbe51 100644 --- a/kernel/lockdep.c +++ b/kernel/lockdep.c | |||
| @@ -168,7 +168,7 @@ static void lock_time_inc(struct lock_time *lt, u64 time) | |||
| 168 | if (time > lt->max) | 168 | if (time > lt->max) | 
| 169 | lt->max = time; | 169 | lt->max = time; | 
| 170 | 170 | ||
| 171 | if (time < lt->min || !lt->min) | 171 | if (time < lt->min || !lt->nr) | 
| 172 | lt->min = time; | 172 | lt->min = time; | 
| 173 | 173 | ||
| 174 | lt->total += time; | 174 | lt->total += time; | 
| @@ -177,8 +177,15 @@ static void lock_time_inc(struct lock_time *lt, u64 time) | |||
| 177 | 177 | ||
| 178 | static inline void lock_time_add(struct lock_time *src, struct lock_time *dst) | 178 | static inline void lock_time_add(struct lock_time *src, struct lock_time *dst) | 
| 179 | { | 179 | { | 
| 180 | dst->min += src->min; | 180 | if (!src->nr) | 
| 181 | dst->max += src->max; | 181 | return; | 
| 182 | |||
| 183 | if (src->max > dst->max) | ||
| 184 | dst->max = src->max; | ||
| 185 | |||
| 186 | if (src->min < dst->min || !dst->nr) | ||
| 187 | dst->min = src->min; | ||
| 188 | |||
| 182 | dst->total += src->total; | 189 | dst->total += src->total; | 
| 183 | dst->nr += src->nr; | 190 | dst->nr += src->nr; | 
| 184 | } | 191 | } | 
| @@ -379,7 +386,8 @@ static int save_trace(struct stack_trace *trace) | |||
| 379 | * complete trace that maxes out the entries provided will be reported | 386 | * complete trace that maxes out the entries provided will be reported | 
| 380 | * as incomplete, friggin useless </rant> | 387 | * as incomplete, friggin useless </rant> | 
| 381 | */ | 388 | */ | 
| 382 | if (trace->entries[trace->nr_entries-1] == ULONG_MAX) | 389 | if (trace->nr_entries != 0 && | 
| 390 | trace->entries[trace->nr_entries-1] == ULONG_MAX) | ||
| 383 | trace->nr_entries--; | 391 | trace->nr_entries--; | 
| 384 | 392 | ||
| 385 | trace->max_entries = trace->nr_entries; | 393 | trace->max_entries = trace->nr_entries; | 
