Re: [PATCH 2/15] sanitize audit_socketcall

2008-12-16 Thread James Morris
On Wed, 17 Dec 2008, Al Viro wrote:

> 
> * don't bother with allocations
> * now that it can't fail, make it return void
> 
> Signed-off-by: Al Viro 

Reviewed-by: James Morris 



-- 
James Morris


--
Linux-audit mailing list
Linux-audit@redhat.com
https://www.redhat.com/mailman/listinfo/linux-audit


[PATCH 2/15] sanitize audit_socketcall

2008-12-16 Thread Al Viro

* don't bother with allocations
* now that it can't fail, make it return void

Signed-off-by: Al Viro 
---
 include/linux/audit.h |4 +-
 kernel/auditsc.c  |   66 
 net/socket.c  |4 +--
 3 files changed, 41 insertions(+), 33 deletions(-)

diff --git a/include/linux/audit.h b/include/linux/audit.h
index 8f0672d..e59feb9 100644
--- a/include/linux/audit.h
+++ b/include/linux/audit.h
@@ -444,7 +444,7 @@ extern void audit_log_task_context(struct audit_buffer *ab);
 extern int __audit_ipc_obj(struct kern_ipc_perm *ipcp);
 extern int __audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t gid, 
mode_t mode);
 extern int audit_bprm(struct linux_binprm *bprm);
-extern int audit_socketcall(int nargs, unsigned long *args);
+extern void audit_socketcall(int nargs, unsigned long *args);
 extern int audit_sockaddr(int len, void *addr);
 extern int __audit_fd_pair(int fd1, int fd2);
 extern int audit_set_macxattr(const char *name);
@@ -525,7 +525,7 @@ extern int audit_signals;
 #define audit_ipc_obj(i) ({ 0; })
 #define audit_ipc_set_perm(q,u,g,m) ({ 0; })
 #define audit_bprm(p) ({ 0; })
-#define audit_socketcall(n,a) ({ 0; })
+#define audit_socketcall(n,a) ((void)0)
 #define audit_fd_pair(n,a) ({ 0; })
 #define audit_sockaddr(len, addr) ({ 0; })
 #define audit_set_macxattr(n) do { ; } while (0)
diff --git a/kernel/auditsc.c b/kernel/auditsc.c
index aca9ddb..1d53aa8 100644
--- a/kernel/auditsc.c
+++ b/kernel/auditsc.c
@@ -156,12 +156,6 @@ struct audit_aux_data_execve {
struct mm_struct *mm;
 };
 
-struct audit_aux_data_socketcall {
-   struct audit_aux_data   d;
-   int nargs;
-   unsigned long   args[0];
-};
-
 struct audit_aux_data_fd_pair {
struct  audit_aux_data d;
int fd[2];
@@ -221,6 +215,14 @@ struct audit_context {
struct audit_tree_refs *trees, *first_trees;
int tree_count;
 
+   int type;
+   union {
+   struct {
+   int nargs;
+   long args[6];
+   } socketcall;
+   };
+
 #if AUDIT_DEBUG
int put_count;
int ino_count;
@@ -1167,6 +1169,27 @@ static void audit_log_execve_info(struct audit_context 
*context,
kfree(buf);
 }
 
+static void show_special(struct audit_context *context)
+{
+   struct audit_buffer *ab;
+   int i;
+
+   ab = audit_log_start(context, GFP_KERNEL, context->type);
+   if (!ab)
+   return;
+
+   switch (context->type) {
+   case AUDIT_SOCKETCALL: {
+   int nargs = context->socketcall.nargs;
+   audit_log_format(ab, "nargs=%d", nargs);
+   for (i = 0; i < nargs; i++)
+   audit_log_format(ab, " a%d=%lx", i,
+   context->socketcall.args[i]);
+   break; }
+   }
+   audit_log_end(ab);
+}
+
 static void audit_log_exit(struct audit_context *context, struct task_struct 
*tsk)
 {
int i, call_panic = 0;
@@ -1311,13 +1334,6 @@ static void audit_log_exit(struct audit_context 
*context, struct task_struct *ts
audit_log_execve_info(context, &ab, axi);
break; }
 
-   case AUDIT_SOCKETCALL: {
-   struct audit_aux_data_socketcall *axs = (void *)aux;
-   audit_log_format(ab, "nargs=%d", axs->nargs);
-   for (i=0; inargs; i++)
-   audit_log_format(ab, " a%d=%lx", i, 
axs->args[i]);
-   break; }
-
case AUDIT_FD_PAIR: {
struct audit_aux_data_fd_pair *axs = (void *)aux;
audit_log_format(ab, "fd0=%d fd1=%d", axs->fd[0], 
axs->fd[1]);
@@ -1327,6 +1343,9 @@ static void audit_log_exit(struct audit_context *context, 
struct task_struct *ts
audit_log_end(ab);
}
 
+   if (context->type)
+   show_special(context);
+
if (context->sockaddr_len) {
ab = audit_log_start(context, GFP_KERNEL, AUDIT_SOCKADDR);
if (ab) {
@@ -1604,6 +1623,7 @@ void audit_syscall_exit(int valid, long return_code)
context->target_pid = 0;
context->target_sid = 0;
context->sockaddr_len = 0;
+   context->type = 0;
kfree(context->filterkey);
context->filterkey = NULL;
tsk->audit_context = context;
@@ -2292,27 +2312,17 @@ int audit_bprm(struct linux_binprm *bprm)
  * @nargs: number of args
  * @args: args array
  *
- * Returns 0 for success or NULL context or < 0 on error.
  */
-int audit_socketcall(int nargs, unsigned long *args)
+void audit_socketcall(int nargs, unsigned long *args)
 {
-   struct audit_aux_data_socketcall *ax;
struct audit_context *context = current->audit_context;
 
if (likel