diff options
author | Luiz Capitulino <lcapitulino@mandriva.com.br> | 2006-03-20 22:17:00 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2006-03-20 22:17:00 -0800 |
commit | 12e1872328e7055d06e539f1b687dc3d0610855c (patch) | |
tree | 8a3315b9c67da38a0cf0284100a2e3c06abca330 /net | |
parent | cdcdbe0b179adca0bcf98f660fcc63e208ae4284 (diff) |
[PKTGEN]: Fix kernel_thread() fail leak.
Free all the alocated resources if kernel_thread() call fails.
Signed-off-by: Luiz Capitulino <lcapitulino@mandriva.com.br>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/core/pktgen.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index f2c0e965c13..eef1392b7f8 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -3082,6 +3082,7 @@ static struct pktgen_thread *__init pktgen_find_thread(const char *name) static int __init pktgen_create_thread(const char *name, int cpu) { + int err; struct pktgen_thread *t = NULL; struct proc_dir_entry *pe; @@ -3120,9 +3121,15 @@ static int __init pktgen_create_thread(const char *name, int cpu) t->removed = 0; - if (kernel_thread((void *)pktgen_thread_worker, (void *)t, - CLONE_FS | CLONE_FILES | CLONE_SIGHAND) < 0) + err = kernel_thread((void *)pktgen_thread_worker, (void *)t, + CLONE_FS | CLONE_FILES | CLONE_SIGHAND); + if (err < 0) { printk("pktgen: kernel_thread() failed for cpu %d\n", t->cpu); + remove_proc_entry(t->name, pg_proc_dir); + list_del(&t->th_list); + kfree(t); + return err; + } return 0; } |