diff options
author | Catalin Marinas <catalin.marinas@arm.com> | 2009-10-28 13:33:11 +0000 |
---|---|---|
committer | Catalin Marinas <catalin.marinas@arm.com> | 2009-10-28 17:07:54 +0000 |
commit | 0587da40be78d3704a48d3e9a619183891727f5f (patch) | |
tree | 3a7e889902990c86a3c76abdf4e39c20360af47b /mm/kmemleak.c | |
parent | a6f5aa1ea05686ad6e84593a00a04161e6dfb3a3 (diff) | |
download | kernel-common-0587da40be78d3704a48d3e9a619183891727f5f.tar.gz kernel-common-0587da40be78d3704a48d3e9a619183891727f5f.tar.bz2 kernel-common-0587da40be78d3704a48d3e9a619183891727f5f.zip |
kmemleak: Release the object lock before calling put_object()
The put_object() function may free the object if the use_count
dropped to 0. There shouldn't be further accesses to such object unless
it is known that the use_count is non-zero.
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Diffstat (limited to 'mm/kmemleak.c')
-rw-r--r-- | mm/kmemleak.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/mm/kmemleak.c b/mm/kmemleak.c index 96106358e042..f06c0921e472 100644 --- a/mm/kmemleak.c +++ b/mm/kmemleak.c @@ -1025,11 +1025,14 @@ static void scan_block(void *_start, void *_end, * added to the gray_list. */ object->count++; - if (color_gray(object)) + if (color_gray(object)) { list_add_tail(&object->gray_list, &gray_list); - else - put_object(object); + spin_unlock_irqrestore(&object->lock, flags); + continue; + } + spin_unlock_irqrestore(&object->lock, flags); + put_object(object); } } |