aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/include/linux/taskstats_kern.h
diff options
context:
space:
mode:
authorOleg Nesterov <oleg@tv-sign.ru>2006-10-28 10:38:51 -0700
committerLinus Torvalds <torvalds@g5.osdl.org>2006-10-28 11:30:54 -0700
commit093a8e8aecd77b2799934996a55a6838e1e2b8f3 (patch)
treeece87b2e194494059b2d4aaa43a094786dac1db7 /include/linux/taskstats_kern.h
parent[PATCH] bacct_add_tsk: fix unsafe and wrong parent/group_leader dereference (diff)
downloadwireguard-linux-093a8e8aecd77b2799934996a55a6838e1e2b8f3.tar.xz
wireguard-linux-093a8e8aecd77b2799934996a55a6838e1e2b8f3.zip
[PATCH] taskstats_tgid_free: fix usage
taskstats_tgid_free() is called on copy_process's error path. This is wrong. IF (clone_flags & CLONE_THREAD) We should not clear ->signal->taskstats, current uses it, it probably has a valid accumulated info. ELSE taskstats_tgid_init() set ->signal->taskstats = NULL, there is nothing to free. Move the callsite to __exit_signal(). We don't need any locking, entire thread group is exiting, nobody should have a reference to soon to be released ->signal. Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru> Cc: Shailabh Nagar <nagar@watson.ibm.com> Cc: Balbir Singh <balbir@in.ibm.com> Cc: Jay Lan <jlan@sgi.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'include/linux/taskstats_kern.h')
-rw-r--r--include/linux/taskstats_kern.h13
1 files changed, 2 insertions, 11 deletions
diff --git a/include/linux/taskstats_kern.h b/include/linux/taskstats_kern.h
index 16894b7edcc8..a437ca0d226b 100644
--- a/include/linux/taskstats_kern.h
+++ b/include/linux/taskstats_kern.h
@@ -49,17 +49,8 @@ static inline void taskstats_tgid_alloc(struct signal_struct *sig)
static inline void taskstats_tgid_free(struct signal_struct *sig)
{
- struct taskstats *stats = NULL;
- unsigned long flags;
-
- spin_lock_irqsave(&sig->stats_lock, flags);
- if (sig->stats) {
- stats = sig->stats;
- sig->stats = NULL;
- }
- spin_unlock_irqrestore(&sig->stats_lock, flags);
- if (stats)
- kmem_cache_free(taskstats_cache, stats);
+ if (sig->stats)
+ kmem_cache_free(taskstats_cache, sig->stats);
}
extern void taskstats_exit_alloc(struct taskstats **, unsigned int *);