diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-04 19:32:11 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-04 19:32:11 -0500 |
commit | fe0bdec68b77020281dc814805edfe594ae89e0f (patch) | |
tree | aeef34a49594cb0478b1104b58ba2dc933c481c5 /ipc/util.c | |
parent | 099e657625e801adf82054c8050dde5aceb68452 (diff) | |
parent | 5af75d8d58d0f9f7b7c0515b35786b22892d5f12 (diff) |
Merge branch 'audit.b61' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/audit-current
* 'audit.b61' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/audit-current:
audit: validate comparison operations, store them in sane form
clean up audit_rule_{add,del} a bit
make sure that filterkey of task,always rules is reported
audit rules ordering, part 2
fixing audit rule ordering mess, part 1
audit_update_lsm_rules() misses the audit_inode_hash[] ones
sanitize audit_log_capset()
sanitize audit_fd_pair()
sanitize audit_mq_open()
sanitize AUDIT_MQ_SENDRECV
sanitize audit_mq_notify()
sanitize audit_mq_getsetattr()
sanitize audit_ipc_set_perm()
sanitize audit_ipc_obj()
sanitize audit_socketcall
don't reallocate buffer in every audit_sockaddr()
Diffstat (limited to 'ipc/util.c')
-rw-r--r-- | ipc/util.c | 18 |
1 files changed, 5 insertions, 13 deletions
diff --git a/ipc/util.c b/ipc/util.c index 5a1808c774a..7585a72e259 100644 --- a/ipc/util.c +++ b/ipc/util.c | |||
@@ -624,10 +624,9 @@ void ipc_rcu_putref(void *ptr) | |||
624 | int ipcperms (struct kern_ipc_perm *ipcp, short flag) | 624 | int ipcperms (struct kern_ipc_perm *ipcp, short flag) |
625 | { /* flag will most probably be 0 or S_...UGO from <linux/stat.h> */ | 625 | { /* flag will most probably be 0 or S_...UGO from <linux/stat.h> */ |
626 | uid_t euid = current_euid(); | 626 | uid_t euid = current_euid(); |
627 | int requested_mode, granted_mode, err; | 627 | int requested_mode, granted_mode; |
628 | 628 | ||
629 | if (unlikely((err = audit_ipc_obj(ipcp)))) | 629 | audit_ipc_obj(ipcp); |
630 | return err; | ||
631 | requested_mode = (flag >> 6) | (flag >> 3) | flag; | 630 | requested_mode = (flag >> 6) | (flag >> 3) | flag; |
632 | granted_mode = ipcp->mode; | 631 | granted_mode = ipcp->mode; |
633 | if (euid == ipcp->cuid || | 632 | if (euid == ipcp->cuid || |
@@ -803,16 +802,10 @@ struct kern_ipc_perm *ipcctl_pre_down(struct ipc_ids *ids, int id, int cmd, | |||
803 | goto out_up; | 802 | goto out_up; |
804 | } | 803 | } |
805 | 804 | ||
806 | err = audit_ipc_obj(ipcp); | 805 | audit_ipc_obj(ipcp); |
807 | if (err) | 806 | if (cmd == IPC_SET) |
808 | goto out_unlock; | 807 | audit_ipc_set_perm(extra_perm, perm->uid, |
809 | |||
810 | if (cmd == IPC_SET) { | ||
811 | err = audit_ipc_set_perm(extra_perm, perm->uid, | ||
812 | perm->gid, perm->mode); | 808 | perm->gid, perm->mode); |
813 | if (err) | ||
814 | goto out_unlock; | ||
815 | } | ||
816 | 809 | ||
817 | euid = current_euid(); | 810 | euid = current_euid(); |
818 | if (euid == ipcp->cuid || | 811 | if (euid == ipcp->cuid || |
@@ -820,7 +813,6 @@ struct kern_ipc_perm *ipcctl_pre_down(struct ipc_ids *ids, int id, int cmd, | |||
820 | return ipcp; | 813 | return ipcp; |
821 | 814 | ||
822 | err = -EPERM; | 815 | err = -EPERM; |
823 | out_unlock: | ||
824 | ipc_unlock(ipcp); | 816 | ipc_unlock(ipcp); |
825 | out_up: | 817 | out_up: |
826 | up_write(&ids->rw_mutex); | 818 | up_write(&ids->rw_mutex); |