Re: [PATCH 4/15] sanitize audit_ipc_set_perm()

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

> 
> * get rid of allocations
> * make it return void
> * simplify callers
> 
> 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 4/15] sanitize audit_ipc_set_perm()

2008-12-16 Thread Al Viro

* get rid of allocations
* make it return void
* simplify callers

Signed-off-by: Al Viro 
---
 include/linux/audit.h |9 +++
 ipc/util.c|   10 ++-
 kernel/auditsc.c  |   59 +---
 3 files changed, 33 insertions(+), 45 deletions(-)

diff --git a/include/linux/audit.h b/include/linux/audit.h
index 97598f0..cd4b1f7 100644
--- a/include/linux/audit.h
+++ b/include/linux/audit.h
@@ -442,7 +442,7 @@ extern int  audit_set_loginuid(struct task_struct *task, 
uid_t loginuid);
 #define audit_get_sessionid(t) ((t)->sessionid)
 extern void audit_log_task_context(struct audit_buffer *ab);
 extern void __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 void __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 void audit_socketcall(int nargs, unsigned long *args);
 extern int audit_sockaddr(int len, void *addr);
@@ -465,11 +465,10 @@ static inline int audit_fd_pair(int fd1, int fd2)
return __audit_fd_pair(fd1, fd2);
return 0;
 }
-static inline int audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t 
gid, mode_t mode)
+static inline void audit_ipc_set_perm(unsigned long qbytes, uid_t uid, gid_t 
gid, mode_t mode)
 {
if (unlikely(!audit_dummy_context()))
-   return __audit_ipc_set_perm(qbytes, uid, gid, mode);
-   return 0;
+   __audit_ipc_set_perm(qbytes, uid, gid, mode);
 }
 static inline int audit_mq_open(int oflag, mode_t mode, struct mq_attr __user 
*u_attr)
 {
@@ -522,7 +521,7 @@ extern int audit_signals;
 #define audit_get_sessionid(t) (-1)
 #define audit_log_task_context(b) do { ; } while (0)
 #define audit_ipc_obj(i) ((void)0)
-#define audit_ipc_set_perm(q,u,g,m) ({ 0; })
+#define audit_ipc_set_perm(q,u,g,m) ((void)0)
 #define audit_bprm(p) ({ 0; })
 #define audit_socketcall(n,a) ((void)0)
 #define audit_fd_pair(n,a) ({ 0; })
diff --git a/ipc/util.c b/ipc/util.c
index 0aa8ed8..b9f328b 100644
--- a/ipc/util.c
+++ b/ipc/util.c
@@ -797,19 +797,15 @@ struct kern_ipc_perm *ipcctl_pre_down(struct ipc_ids 
*ids, int id, int cmd,
}
 
audit_ipc_obj(ipcp);
-
-   if (cmd == IPC_SET) {
-   err = audit_ipc_set_perm(extra_perm, perm->uid,
+   if (cmd == IPC_SET)
+   audit_ipc_set_perm(extra_perm, perm->uid,
 perm->gid, perm->mode);
-   if (err)
-   goto out_unlock;
-   }
+
if (current->euid == ipcp->cuid ||
current->euid == ipcp->uid || capable(CAP_SYS_ADMIN))
return ipcp;
 
err = -EPERM;
-out_unlock:
ipc_unlock(ipcp);
 out_up:
up_write(&ids->rw_mutex);
diff --git a/kernel/auditsc.c b/kernel/auditsc.c
index c136047..9d4ac11 100644
--- a/kernel/auditsc.c
+++ b/kernel/auditsc.c
@@ -139,16 +139,6 @@ struct audit_aux_data_mq_getsetattr {
struct mq_attr  mqstat;
 };
 
-struct audit_aux_data_ipcctl {
-   struct audit_aux_data   d;
-   struct ipc_perm p;
-   unsigned long   qbytes;
-   uid_t   uid;
-   gid_t   gid;
-   mode_t  mode;
-   u32 osid;
-};
-
 struct audit_aux_data_execve {
struct audit_aux_data   d;
int argc;
@@ -226,6 +216,11 @@ struct audit_context {
gid_t   gid;
mode_t  mode;
u32 osid;
+   int has_perm;
+   uid_t   perm_uid;
+   gid_t   perm_gid;
+   mode_t  perm_mode;
+   unsigned long   qbytes;
} ipc;
};
 
@@ -1201,6 +1196,19 @@ static void show_special(struct audit_context *context, 
int *call_panic)
security_release_secctx(ctx, len);
}
}
+   if (context->ipc.has_perm) {
+   audit_log_end(ab);
+   ab = audit_log_start(context, GFP_KERNEL,
+AUDIT_IPC_SET_PERM);
+   audit_log_format(ab,
+   "qbytes=%lx ouid=%u ogid=%u mode=%#o",
+   context->ipc.qbytes,
+   context->ipc.perm_uid,
+   context->ipc.perm_gid,
+   context->ipc.perm_mode);
+   if (!ab)
+   return;
+   }
break; }
}
audit_log_end(ab);
@@ -1318,13 +1326,6 @@ static void audit_log_exit(struct audit_