moving audit_free() up into do_exit()
A message that is not in the archive (sent off-list or not yet received): [email protected]
A message that is not in the archive (sent off-list or not yet received): [email protected]
A message that is not in the archive (sent off-list or not yet received): [email protected]
Quoted 4 lines · Alexander Viro
Quoted 1 line · Alexander Viro
OK, preliminary patches attached; the first one is minimal "take care of
Gah... Attached to this followup; my apologies.
In audit-exit.patch
@@ -607,12 +605,12 @@ static void audit_log_exit(struct audit_
context->gid,
context->euid, context->suid, context->fsuid, context->egid, context->sgid, context->fsgid, tty);
- audit_log_task_info(ab, gfp_mask);
+ audit_log_task_info(ab);
audit_log_end(ab);
for (aux = context->aux; aux; aux = aux->next) {
- ab = audit_log_start(context, gfp_mask, aux->type);
+ ab = audit_log_start(context, GFP_KERNEL, aux->type);
if (!ab)
continue; /* audit_panic has been called */
It doesn't compile....it needs:
+ audit_log_task_info(ab, tsk);
Also, piece in kernel/exit.c complains of implicit declaration of 'audit_free'.
-Steve
Quoted 7 lines · Steve Grubb
Quoted 4 lines · Alexander Viro
Quoted 1 line · Alexander Viro
OK, preliminary patches attached; the first one is minimal "take care of
Gah... Attached to this followup; my apologies.
In audit-exit.patch
[snip]
Fixed, pushed to kernel.org audit-current, updated patch follows:
arch/i386/kernel/ptrace.c +3 -4
@@ -671,7 +671,7 @@ int do_syscall_trace(struct pt_regs *regif (unlikely (current->audit_context)) {if (entryexit) -audit_syscall_exit (current,AUDITSC_RESULT (regs->eax), +audit_syscall_exit (AUDITSC_RESULT (regs->eax), regs->eax);/* Debug traps, when using PTRACE_SINGLESTEP, must be sent only * on the syscall exit path. Normally, when TIF_SYSCALL_AUDIT is
@@ -720,14 +720,13 @@ int do_syscall_trace(struct pt_regs *reg ret = is_sysemu; out:if (unlikely (current->audit_context) && !entryexit) -audit_syscall_entry (current,AUDIT_ARCH_I386 , regs->orig_eax, +audit_syscall_entry (AUDIT_ARCH_I386 , regs->orig_eax, regs->ebx, regs->ecx, regs->edx, regs->esi);if (ret ==0 )return 0 ; regs->orig_eax =-1 ;/* force skip of syscall restarting */ if (unlikely (current->audit_context)) -audit_syscall_exit (current,AUDITSC_RESULT (regs->eax), - regs->eax); +audit_syscall_exit (AUDITSC_RESULT (regs->eax), regs->eax);return 1 ; }
arch/i386/kernel/vm86.c +1 -1
@@ -312,7 +312,7 @@ static void do_sys_vm86(struct kernel_vm/*call audit_syscall_exit since we do not exit via the normal paths */ if (unlikely (current->audit_context)) -audit_syscall_exit (current,AUDITSC_RESULT (eax), eax); +audit_syscall_exit (AUDITSC_RESULT (eax), eax); __asm__ __volatile__( "movl %0,%%esp\n\t"
arch/ia64/kernel/ptrace.c +2 -2
@@ -1644,7 +1644,7 @@ syscall_trace_enter (long arg0, long arg arch =AUDIT_ARCH_IA64 ; } -audit_syscall_entry (current, arch, syscall, arg0, arg1, arg2, arg3); +audit_syscall_entry (arch, syscall, arg0, arg1, arg2, arg3); } }
@@ -1662,7 +1662,7 @@ syscall_trace_leave (long arg0, long argif (success !=AUDITSC_SUCCESS ) result = -result; -audit_syscall_exit (current, success, result); +audit_syscall_exit (success, result); } if (test_thread_flag(TIF_SYSCALL_TRACE)
arch/mips/kernel/ptrace.c +2 -2
@@ -469,7 +469,7 @@ static inline int audit_arch(void) asmlinkage void do_syscall_trace(struct pt_regs *regs, int entryexit) {if (unlikely (current->audit_context) && entryexit) -audit_syscall_exit (current,AUDITSC_RESULT (regs->regs[2 ]), +audit_syscall_exit (AUDITSC_RESULT (regs->regs[2 ]), regs->regs[2 ]);if (!(current->ptrace &PT_PTRACED ))
@@ -493,7 +493,7 @@ asmlinkage void do_syscall_trace(struct } out:if (unlikely (current->audit_context) && !entryexit) -audit_syscall_entry (current,audit_arch (), regs->regs[2 ], +audit_syscall_entry (audit_arch (), regs->regs[2 ], regs->regs[4 ], regs->regs[5 ], regs->regs[6 ], regs->regs[7 ]); }
arch/powerpc/kernel/ptrace.c +2 -3
@@ -538,7 +538,7 @@ void do_syscall_trace_enter(struct pt_redo_syscall_trace (); if (unlikely(current->audit_context)) - audit_syscall_entry(current, + audit_syscall_entry(#ifdef CONFIG_PPC32 AUDIT_ARCH_PPC,#else
@@ -556,8 +556,7 @@ void do_syscall_trace_leave(struct pt_re#endif if (unlikely (current->audit_context)) -audit_syscall_exit (current, - (regs->ccr&0x1000 )?AUDITSC_FAILURE :AUDITSC_SUCCESS , +audit_syscall_exit ((regs->ccr&0x1000 )?AUDITSC_FAILURE :AUDITSC_SUCCESS , regs->result); if ((test_thread_flag(TIF_SYSCALL_TRACE)
arch/s390/kernel/ptrace.c +2 -3
@@ -734,7 +734,7 @@ asmlinkage void syscall_trace(struct pt_regs *regs, int entryexit) {if (unlikely (current->audit_context) && entryexit) -audit_syscall_exit (current,AUDITSC_RESULT (regs->gprs[2 ]), regs->gprs[2 ]); +audit_syscall_exit (AUDITSC_RESULT (regs->gprs[2 ]), regs->gprs[2 ]);if (!test_thread_flag (TIF_SYSCALL_TRACE )) goto out;
@@ -761,8 +761,7 @@ syscall_trace(struct pt_regs *regs, int } out:if (unlikely (current->audit_context) && !entryexit) -audit_syscall_entry (current, -test_thread_flag (TIF_31BIT )?AUDIT_ARCH_S390 :AUDIT_ARCH_S390X , +audit_syscall_entry (test_thread_flag (TIF_31BIT )?AUDIT_ARCH_S390 :AUDIT_ARCH_S390X , regs->gprs[2 ], regs->orig_gpr2, regs->gprs[3 ], regs->gprs[4 ], regs->gprs[5 ]); }
arch/sparc64/kernel/ptrace.c +2 -3
@@ -630,7 +630,7 @@ asmlinkage void syscall_trace(struct pt_if (unlikely (tstate & (TSTATE_XCARRY |TSTATE_ICARRY ))) result =AUDITSC_FAILURE ; -audit_syscall_exit (current, result, regs->u_regs[UREG_I0 ]); +audit_syscall_exit (result, regs->u_regs[UREG_I0 ]); }if (!(current->ptrace &PT_PTRACED ))
@@ -654,8 +654,7 @@ asmlinkage void syscall_trace(struct pt_ out:if (unlikely (current->audit_context) && !syscall_exit_p) - audit_syscall_entry(current, - (test_thread_flag(TIF_32BIT) ? + audit_syscall_entry((test_thread_flag(TIF_32BIT) ? AUDIT_ARCH_SPARC : AUDIT_ARCH_SPARC64), regs->u_regs[UREG_G1],
arch/um/kernel/ptrace.c +2 -4
@@ -269,15 +269,13 @@ void syscall_trace(union uml_pt_regs *reif (unlikely (current->audit_context)) {if (!entryexit) -audit_syscall_entry (current, -HOST_AUDIT_ARCH , +audit_syscall_entry (HOST_AUDIT_ARCH ,UPT_SYSCALL_NR (regs),UPT_SYSCALL_ARG1 (regs),UPT_SYSCALL_ARG2 (regs),UPT_SYSCALL_ARG3 (regs),UPT_SYSCALL_ARG4 (regs)); -else audit_syscall_exit (current, -AUDITSC_RESULT (UPT_SYSCALL_RET (regs)), +else audit_syscall_exit (AUDITSC_RESULT (UPT_SYSCALL_RET (regs)),UPT_SYSCALL_RET (regs)); }
arch/x86_64/kernel/ptrace.c +3 -3
@@ -605,12 +605,12 @@ asmlinkage void syscall_trace_enter(struif (unlikely (current->audit_context)) {if (test_thread_flag (TIF_IA32 )) { -audit_syscall_entry (current,AUDIT_ARCH_I386 , +audit_syscall_entry (AUDIT_ARCH_I386 , regs->orig_rax, regs->rbx, regs->rcx, regs->rdx, regs->rsi); }else { -audit_syscall_entry (current,AUDIT_ARCH_X86_64 , +audit_syscall_entry (AUDIT_ARCH_X86_64 , regs->orig_rax, regs->rdi, regs->rsi, regs->rdx, regs->r10);
@@ -621,7 +621,7 @@ asmlinkage void syscall_trace_enter(stru asmlinkage void syscall_trace_leave(struct pt_regs *regs) {if (unlikely (current->audit_context)) -audit_syscall_exit (current,AUDITSC_RESULT (regs->rax), regs->rax); +audit_syscall_exit (AUDITSC_RESULT (regs->rax), regs->rax);if ((test_thread_flag (TIF_SYSCALL_TRACE ) || test_thread_flag(TIF_SINGLESTEP))
include/linux/audit.h +4 -4
@@ -287,10 +287,10 @@ struct netlink_skb_parms;/* Public API */ extern int audit_alloc (struct task_struct *task);extern void audit_free (struct task_struct *task); -extern void audit_syscall_entry (struct task_struct *task,int arch, +extern void audit_syscall_entry (int arch,int major,unsigned long a0,unsigned long a1,unsigned long a2,unsigned long a3); -extern void audit_syscall_exit (struct task_struct *task,int failed,long return_code); +extern void audit_syscall_exit (int failed,long return_code);extern void audit_getname (const char *name);extern void audit_putname (const char *name);extern void __audit_inode (const char *name,const struct inode *inode,unsigned flags);
@@ -323,8 +323,8 @@ extern int audit_set_macxattr(const char#else #define audit_alloc (t) ({ 0; })#define audit_free (t) do { ; } while (0) -#define audit_syscall_entry (t,ta,a,b,c,d,e) do { ; } while (0) -#define audit_syscall_exit (t,f,r) do { ; } while (0) +#define audit_syscall_entry (ta,a,b,c,d,e) do { ; } while (0) +#define audit_syscall_exit (f,r) do { ; } while (0)#define audit_getname (n) do { ; } while (0)#define audit_putname (n) do { ; } while (0)#define __audit_inode (n,i,f) do { ; } while (0)
kernel/auditsc.c +36 -49
197 lines not on this page · raw message
kernel/exit.c +3 -0
@@ -34,6 +34,7 @@#include <linux/mutex.h> #include <linux/futex.h> #include <linux/compat.h> +#include <linux/audit.h> /* for audit_free() */ #include <asm/uaccess.h> #include <asm/unistd.h>
@@ -904,6 +905,8 @@ fastcall NORET_TYPE void do_exit(long coif (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);
kernel/fork.c +0 -2
@@ -116,8 +116,6 @@ void __put_task_struct_cb(struct rcu_heaWARN_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);