x86, ptrace, mm: fix double-free on race

Ptrace_detach() races with __ptrace_unlink() if the traced task is
reaped while detaching. This might cause a double-free of the BTS
buffer.

Change the ptrace_detach() path to only do the memory accounting in
ptrace_bts_detach() and leave the buffer free to ptrace_bts_untrace()
which will be called from __ptrace_unlink().

The fix follows a proposal from Oleg Nesterov.

Reported-by: Oleg Nesterov <[email protected]>
Signed-off-by: Markus Metzger <[email protected]>
Signed-off-by: Ingo Molnar <[email protected]>
This commit is contained in:
Markus Metzger 2009-02-11 15:10:27 +01:00 • committed by Ingo Molnar
commit 9f339e7028
3 changed files with 17 additions and 7 deletions

View file

@ -657,7 +657,7 @@ void *alloc_locked_buffer(size_t size)
return buffer;
}
void free_locked_buffer(void *buffer, size_t size)
void release_locked_buffer(void *buffer, size_t size)
{
unsigned long pgsz = PAGE_ALIGN(size) >> PAGE_SHIFT;
@ -667,6 +667,11 @@ void free_locked_buffer(void *buffer, size_t size)
current->mm->locked_vm -= pgsz;
up_write(&current->mm->mmap_sem);
}
void free_locked_buffer(void *buffer, size_t size)
{
release_locked_buffer(buffer, size);
kfree(buffer);
}