浏览代码

AUDIT: Defer freeing aux items until audit_free_context()

While they were all just simple blobs it made sense to just free them
as we walked through and logged them. Now that there are pointers to
other objects which need refcounting, we might as well revert to
_only_ logging them in audit_log_exit(), and put the code to free them
properly in only one place -- in audit_free_aux().

Signed-off-by: David Woodhouse <dwmw2@infradead.org>
----------------------------------------------------------
David Woodhouse 20 年之前
父节点
当前提交
7551ced334
共有 1 个文件被更改,包括 2 次插入8 次删除
  1. 2 8
      kernel/auditsc.c

+ 2 - 8
kernel/auditsc.c

@@ -675,6 +675,7 @@ static void audit_log_exit(struct audit_context *context)
 {
 {
 	int i;
 	int i;
 	struct audit_buffer *ab;
 	struct audit_buffer *ab;
+	struct audit_aux_data *aux;
 
 
 	ab = audit_log_start(context, AUDIT_SYSCALL);
 	ab = audit_log_start(context, AUDIT_SYSCALL);
 	if (!ab)
 	if (!ab)
@@ -705,10 +706,8 @@ static void audit_log_exit(struct audit_context *context)
 		  context->egid, context->sgid, context->fsgid);
 		  context->egid, context->sgid, context->fsgid);
 	audit_log_task_info(ab);
 	audit_log_task_info(ab);
 	audit_log_end(ab);
 	audit_log_end(ab);
-	while (context->aux) {
-		struct audit_aux_data *aux;
 
 
-		aux = context->aux;
+	for (aux = context->aux; aux; aux = aux->next) {
 
 
 		ab = audit_log_start(context, aux->type);
 		ab = audit_log_start(context, aux->type);
 		if (!ab)
 		if (!ab)
@@ -740,15 +739,10 @@ static void audit_log_exit(struct audit_context *context)
 		case AUDIT_AVC_PATH: {
 		case AUDIT_AVC_PATH: {
 			struct audit_aux_data_path *axi = (void *)aux;
 			struct audit_aux_data_path *axi = (void *)aux;
 			audit_log_d_path(ab, "path=", axi->dentry, axi->mnt);
 			audit_log_d_path(ab, "path=", axi->dentry, axi->mnt);
-			dput(axi->dentry);
-			mntput(axi->mnt);
 			break; }
 			break; }
 
 
 		}
 		}
 		audit_log_end(ab);
 		audit_log_end(ab);
-
-		context->aux = aux->next;
-		kfree(aux);
 	}
 	}
 
 
 	for (i = 0; i < context->name_count; i++) {
 	for (i = 0; i < context->name_count; i++) {