diff options
Diffstat (limited to 'ipc/shm.c')
-rw-r--r-- | ipc/shm.c | 42 |
1 files changed, 4 insertions, 38 deletions
@@ -126,18 +126,6 @@ static inline struct shmid_kernel *shm_lock_down(struct ipc_namespace *ns, | |||
126 | return container_of(ipcp, struct shmid_kernel, shm_perm); | 126 | return container_of(ipcp, struct shmid_kernel, shm_perm); |
127 | } | 127 | } |
128 | 128 | ||
129 | static inline struct shmid_kernel *shm_lock_check_down( | ||
130 | struct ipc_namespace *ns, | ||
131 | int id) | ||
132 | { | ||
133 | struct kern_ipc_perm *ipcp = ipc_lock_check_down(&shm_ids(ns), id); | ||
134 | |||
135 | if (IS_ERR(ipcp)) | ||
136 | return (struct shmid_kernel *)ipcp; | ||
137 | |||
138 | return container_of(ipcp, struct shmid_kernel, shm_perm); | ||
139 | } | ||
140 | |||
141 | /* | 129 | /* |
142 | * shm_lock_(check_) routines are called in the paths where the rw_mutex | 130 | * shm_lock_(check_) routines are called in the paths where the rw_mutex |
143 | * is not held. | 131 | * is not held. |
@@ -620,33 +608,11 @@ static int shmctl_down(struct ipc_namespace *ns, int shmid, int cmd, | |||
620 | return -EFAULT; | 608 | return -EFAULT; |
621 | } | 609 | } |
622 | 610 | ||
623 | down_write(&shm_ids(ns).rw_mutex); | 611 | ipcp = ipcctl_pre_down(&shm_ids(ns), shmid, cmd, &shmid64.shm_perm, 0); |
624 | shp = shm_lock_check_down(ns, shmid); | 612 | if (IS_ERR(ipcp)) |
625 | if (IS_ERR(shp)) { | 613 | return PTR_ERR(ipcp); |
626 | err = PTR_ERR(shp); | ||
627 | goto out_up; | ||
628 | } | ||
629 | |||
630 | ipcp = &shp->shm_perm; | ||
631 | |||
632 | err = audit_ipc_obj(ipcp); | ||
633 | if (err) | ||
634 | goto out_unlock; | ||
635 | |||
636 | if (cmd == IPC_SET) { | ||
637 | err = audit_ipc_set_perm(0, shmid64.shm_perm.uid, | ||
638 | shmid64.shm_perm.gid, | ||
639 | shmid64.shm_perm.mode); | ||
640 | if (err) | ||
641 | goto out_unlock; | ||
642 | } | ||
643 | 614 | ||
644 | if (current->euid != ipcp->uid && | 615 | shp = container_of(ipcp, struct shmid_kernel, shm_perm); |
645 | current->euid != ipcp->cuid && | ||
646 | !capable(CAP_SYS_ADMIN)) { | ||
647 | err = -EPERM; | ||
648 | goto out_unlock; | ||
649 | } | ||
650 | 616 | ||
651 | err = security_shm_shmctl(shp, cmd); | 617 | err = security_shm_shmctl(shp, cmd); |
652 | if (err) | 618 | if (err) |