浏览代码

[PATCH] move call of audit_free() into do_exit()

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Al Viro 19 年之前
父节点
当前提交
fa84cb935d
共有 3 个文件被更改,包括 4 次插入10 次删除
  1. 1 8
      kernel/auditsc.c
  2. 3 0
      kernel/exit.c
  3. 0 2
      kernel/fork.c

+ 1 - 8
kernel/auditsc.c

@@ -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
  * audit_free - free a per-task audit context
  * @tsk: task whose audit context block to free
  * @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)
 void audit_free(struct task_struct *tsk)
 {
 {
 	struct audit_context *context;
 	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);
 	context = audit_get_context(tsk, 0, 0);
 	if (likely(!context))
 	if (likely(!context))
 		return;
 		return;

+ 3 - 0
kernel/exit.c

@@ -35,6 +35,7 @@
 #include <linux/futex.h>
 #include <linux/futex.h>
 #include <linux/compat.h>
 #include <linux/compat.h>
 #include <linux/pipe_fs_i.h>
 #include <linux/pipe_fs_i.h>
+#include <linux/audit.h> /* for audit_free() */
 
 
 #include <asm/uaccess.h>
 #include <asm/uaccess.h>
 #include <asm/unistd.h>
 #include <asm/unistd.h>
@@ -910,6 +911,8 @@ fastcall NORET_TYPE void do_exit(long code)
 	if (unlikely(tsk->compat_robust_list))
 	if (unlikely(tsk->compat_robust_list))
 		compat_exit_robust_list(tsk);
 		compat_exit_robust_list(tsk);
 #endif
 #endif
+	if (unlikely(tsk->audit_context))
+		audit_free(tsk);
 	exit_mm(tsk);
 	exit_mm(tsk);
 
 
 	exit_sem(tsk);
 	exit_sem(tsk);

+ 0 - 2
kernel/fork.c

@@ -114,8 +114,6 @@ void __put_task_struct(struct task_struct *tsk)
 	WARN_ON(atomic_read(&tsk->usage));
 	WARN_ON(atomic_read(&tsk->usage));
 	WARN_ON(tsk == current);
 	WARN_ON(tsk == current);
 
 
-	if (unlikely(tsk->audit_context))
-		audit_free(tsk);
 	security_task_free(tsk);
 	security_task_free(tsk);
 	free_uid(tsk->user);
 	free_uid(tsk->user);
 	put_group_info(tsk->group_info);
 	put_group_info(tsk->group_info);