[PATCH] move call of audit_free() into do_exit()
authorAl Viro <viro@zeniv.linux.org.uk>
Thu, 30 Mar 2006 01:30:19 +0000 (20:30 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Mon, 1 May 2006 10:06:13 +0000 (06:06 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
kernel/auditsc.c
kernel/exit.c
kernel/fork.c

index 4052f0aec1d3bbae594eb4624373eb14f25d1880..8ec52ffad6334b09f7683ae5ba41192a0e9eb31d 100644 (file)
@@ -698,19 +698,12 @@ static void audit_log_exit(struct audit_context *context, struct task_struct *ts
  * audit_free - free a per-task audit context
  * @tsk: task whose audit context block to free
  *
- * Called from copy_process and __put_task_struct.
+ * Called from copy_process and do_exit
  */
 void audit_free(struct task_struct *tsk)
 {
        struct audit_context *context;
 
-       /*
-        * No need to lock the task - when we execute audit_free()
-        * then the task has no external references anymore, and
-        * we are tearing it down. (The locking also confuses
-        * DEBUG_LOCKDEP - this freeing may occur in softirq
-        * contexts as well, via RCU.)
-        */
        context = audit_get_context(tsk, 0, 0);
        if (likely(!context))
                return;
index f86434d7b3d1811b689bfedcfc1bc40079950a34..e95b932822109e6bd517eee9a67876fedc91b426 100644 (file)
@@ -35,6 +35,7 @@
 #include <linux/futex.h>
 #include <linux/compat.h>
 #include <linux/pipe_fs_i.h>
+#include <linux/audit.h> /* for audit_free() */
 
 #include <asm/uaccess.h>
 #include <asm/unistd.h>
@@ -910,6 +911,8 @@ fastcall NORET_TYPE void do_exit(long code)
        if (unlikely(tsk->compat_robust_list))
                compat_exit_robust_list(tsk);
 #endif
+       if (unlikely(tsk->audit_context))
+               audit_free(tsk);
        exit_mm(tsk);
 
        exit_sem(tsk);
index d2fa57d480d4af9c868c2e7a5602f50b6e164795..ac8100e3088a1f6d99d8ad640a70a3de5ec96e5e 100644 (file)
@@ -114,8 +114,6 @@ void __put_task_struct(struct task_struct *tsk)
        WARN_ON(atomic_read(&tsk->usage));
        WARN_ON(tsk == current);
 
-       if (unlikely(tsk->audit_context))
-               audit_free(tsk);
        security_task_free(tsk);
        free_uid(tsk->user);
        put_group_info(tsk->group_info);