summaryrefslogtreecommitdiffstats
path: root/mm/kmemleak.c
diff options
context:
space:
mode:
authorCatalin Marinas2009-10-28 14:33:11 +0100
committerCatalin Marinas2009-10-28 18:07:54 +0100
commit0587da40be78d3704a48d3e9a619183891727f5f (patch)
tree3a7e889902990c86a3c76abdf4e39c20360af47b /mm/kmemleak.c
parentkmemleak: Scan the _ftrace_events section in modules (diff)
downloadkernel-qcow2-linux-0587da40be78d3704a48d3e9a619183891727f5f.tar.gz
kernel-qcow2-linux-0587da40be78d3704a48d3e9a619183891727f5f.tar.xz
kernel-qcow2-linux-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.c9
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);
}
}