diff options
| author | Linus Torvalds <torvalds@home.transmeta.com> | 2003-02-27 07:02:33 -0800 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.transmeta.com> | 2003-02-27 07:02:33 -0800 |
| commit | 63ac2a63e5d31b6d1fbc6a4a55909be84f4e386f (patch) | |
| tree | 659e372d776fef4a090217e8d0d6f4834aa8b0ac /kernel | |
| parent | ea3d5d12e318d3c2a00a3ee34c9309c559a3601e (diff) | |
Avoid memory leak on fork() failure path.
Noticed by Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/fork.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index ce4d721d0ced..6b423ee75c9f 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -72,15 +72,8 @@ int nr_processes(void) return total; } -void __put_task_struct(struct task_struct *tsk) +static void free_task_struct(struct task_struct *tsk) { - WARN_ON(!(tsk->state & (TASK_DEAD | TASK_ZOMBIE))); - WARN_ON(atomic_read(&tsk->usage)); - WARN_ON(tsk == current); - - security_task_free(tsk); - free_uid(tsk->user); - /* * The task cache is effectively disabled right now. * Do we want it? The slab cache already has per-cpu @@ -103,6 +96,17 @@ void __put_task_struct(struct task_struct *tsk) } } +void __put_task_struct(struct task_struct *tsk) +{ + WARN_ON(!(tsk->state & (TASK_DEAD | TASK_ZOMBIE))); + WARN_ON(atomic_read(&tsk->usage)); + WARN_ON(tsk == current); + + security_task_free(tsk); + free_uid(tsk->user); + free_task_struct(tsk); +} + void add_wait_queue(wait_queue_head_t *q, wait_queue_t * wait) { unsigned long flags; @@ -1034,7 +1038,7 @@ bad_fork_cleanup_count: atomic_dec(&p->user->processes); free_uid(p->user); bad_fork_free: - put_task_struct(p); + free_task_struct(p); goto fork_out; } |
