Deleted Added
full compact
sysv_sem.c (160293) sysv_sem.c (162468)
1/*-
2 * Implementation of SVID semaphores
3 *
4 * Author: Daniel Boulet
5 *
6 * This software is provided ``AS IS'' without any warranties of any kind.
7 */
8/*-

--- 23 unchanged lines hidden (view full) ---

32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 * SUCH DAMAGE.
37 */
38
39#include <sys/cdefs.h>
1/*-
2 * Implementation of SVID semaphores
3 *
4 * Author: Daniel Boulet
5 *
6 * This software is provided ``AS IS'' without any warranties of any kind.
7 */
8/*-

--- 23 unchanged lines hidden (view full) ---

32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 * SUCH DAMAGE.
37 */
38
39#include <sys/cdefs.h>
40__FBSDID("$FreeBSD: head/sys/kern/sysv_sem.c 160293 2006-07-12 11:41:53Z kib $");
40__FBSDID("$FreeBSD: head/sys/kern/sysv_sem.c 162468 2006-09-20 13:40:00Z rwatson $");
41
42#include "opt_sysvipc.h"
43#include "opt_mac.h"
44
45#include <sys/param.h>
46#include <sys/systm.h>
47#include <sys/sysproto.h>
48#include <sys/eventhandler.h>

--- 14 unchanged lines hidden (view full) ---

63
64static MALLOC_DEFINE(M_SEM, "sem", "SVID compatible semaphores");
65
66#ifdef SEM_DEBUG
67#define DPRINTF(a) printf a
68#else
69#define DPRINTF(a)
70#endif
41
42#include "opt_sysvipc.h"
43#include "opt_mac.h"
44
45#include <sys/param.h>
46#include <sys/systm.h>
47#include <sys/sysproto.h>
48#include <sys/eventhandler.h>

--- 14 unchanged lines hidden (view full) ---

63
64static MALLOC_DEFINE(M_SEM, "sem", "SVID compatible semaphores");
65
66#ifdef SEM_DEBUG
67#define DPRINTF(a) printf a
68#else
69#define DPRINTF(a)
70#endif
71#ifdef MAC_DEBUG
72#define MPRINTF(a) printf a
73#else
74#define MPRINTF(a)
75#endif
76
77static void seminit(void);
78static int sysvsem_modload(struct module *, int, void *);
79static int semunload(void);
80static void semexit_myhook(void *arg, struct proc *p);
81static int sysctl_sema(SYSCTL_HANDLER_ARGS);
82static int semvalid(int semid, struct semid_kernel *semakptr);
83

--- 561 unchanged lines hidden (view full) ---

645 if ((semakptr->u.sem_perm.mode & SEM_ALLOC) == 0) {
646 error = EINVAL;
647 goto done2;
648 }
649 if ((error = ipcperm(td, &semakptr->u.sem_perm, IPC_R)))
650 goto done2;
651#ifdef MAC
652 error = mac_check_sysv_semctl(cred, semakptr, cmd);
71
72static void seminit(void);
73static int sysvsem_modload(struct module *, int, void *);
74static int semunload(void);
75static void semexit_myhook(void *arg, struct proc *p);
76static int sysctl_sema(SYSCTL_HANDLER_ARGS);
77static int semvalid(int semid, struct semid_kernel *semakptr);
78

--- 561 unchanged lines hidden (view full) ---

640 if ((semakptr->u.sem_perm.mode & SEM_ALLOC) == 0) {
641 error = EINVAL;
642 goto done2;
643 }
644 if ((error = ipcperm(td, &semakptr->u.sem_perm, IPC_R)))
645 goto done2;
646#ifdef MAC
647 error = mac_check_sysv_semctl(cred, semakptr, cmd);
653 if (error != 0) {
654 MPRINTF(("mac_check_sysv_semctl returned %d\n",
655 error));
648 if (error != 0)
656 goto done2;
649 goto done2;
657 }
658#endif
659 bcopy(&semakptr->u, arg->buf, sizeof(struct semid_ds));
660 *rval = IXSEQ_TO_IPCID(semid, semakptr->u.sem_perm);
661 mtx_unlock(sema_mtxp);
662 return (0);
663 }
664
665 semidx = IPCID_TO_IX(semid);
666 if (semidx < 0 || semidx >= seminfo.semmni)
667 return (EINVAL);
668
669 semakptr = &sema[semidx];
670 sema_mtxp = &sema_mtx[semidx];
671 mtx_lock(sema_mtxp);
672#ifdef MAC
673 error = mac_check_sysv_semctl(cred, semakptr, cmd);
650#endif
651 bcopy(&semakptr->u, arg->buf, sizeof(struct semid_ds));
652 *rval = IXSEQ_TO_IPCID(semid, semakptr->u.sem_perm);
653 mtx_unlock(sema_mtxp);
654 return (0);
655 }
656
657 semidx = IPCID_TO_IX(semid);
658 if (semidx < 0 || semidx >= seminfo.semmni)
659 return (EINVAL);
660
661 semakptr = &sema[semidx];
662 sema_mtxp = &sema_mtx[semidx];
663 mtx_lock(sema_mtxp);
664#ifdef MAC
665 error = mac_check_sysv_semctl(cred, semakptr, cmd);
674 if (error != 0) {
675 MPRINTF(("mac_check_sysv_semctl returned %d\n", error));
666 if (error != 0)
676 goto done2;
667 goto done2;
677 }
678#endif
679
680 error = 0;
681 *rval = 0;
682
683 switch (cmd) {
684 case IPC_RMID:
685 if ((error = semvalid(semid, semakptr)) != 0)

--- 235 unchanged lines hidden (view full) ---

921 }
922 if ((semflg & IPC_CREAT) && (semflg & IPC_EXCL)) {
923 DPRINTF(("not exclusive\n"));
924 error = EEXIST;
925 goto done2;
926 }
927#ifdef MAC
928 error = mac_check_sysv_semget(cred, &sema[semid]);
668#endif
669
670 error = 0;
671 *rval = 0;
672
673 switch (cmd) {
674 case IPC_RMID:
675 if ((error = semvalid(semid, semakptr)) != 0)

--- 235 unchanged lines hidden (view full) ---

911 }
912 if ((semflg & IPC_CREAT) && (semflg & IPC_EXCL)) {
913 DPRINTF(("not exclusive\n"));
914 error = EEXIST;
915 goto done2;
916 }
917#ifdef MAC
918 error = mac_check_sysv_semget(cred, &sema[semid]);
929 if (error != 0) {
930 MPRINTF(("mac_check_sysv_semget returned %d\n",
931 error));
919 if (error != 0)
932 goto done2;
920 goto done2;
933 }
934#endif
935 goto found;
936 }
937 }
938
939 DPRINTF(("need to allocate the semid_kernel\n"));
940 if (key == IPC_PRIVATE || (semflg & IPC_CREAT)) {
941 if (nsems <= 0 || nsems > seminfo.semmsl) {

--- 143 unchanged lines hidden (view full) ---

1085 }
1086
1087 if ((error = ipcperm(td, &semakptr->u.sem_perm, j))) {
1088 DPRINTF(("error = %d from ipaccess\n", error));
1089 goto done2;
1090 }
1091#ifdef MAC
1092 error = mac_check_sysv_semop(td->td_ucred, semakptr, j);
921#endif
922 goto found;
923 }
924 }
925
926 DPRINTF(("need to allocate the semid_kernel\n"));
927 if (key == IPC_PRIVATE || (semflg & IPC_CREAT)) {
928 if (nsems <= 0 || nsems > seminfo.semmsl) {

--- 143 unchanged lines hidden (view full) ---

1072 }
1073
1074 if ((error = ipcperm(td, &semakptr->u.sem_perm, j))) {
1075 DPRINTF(("error = %d from ipaccess\n", error));
1076 goto done2;
1077 }
1078#ifdef MAC
1079 error = mac_check_sysv_semop(td->td_ucred, semakptr, j);
1093 if (error != 0) {
1094 MPRINTF(("mac_check_sysv_semop returned %d\n", error));
1080 if (error != 0)
1095 goto done2;
1081 goto done2;
1096 }
1097#endif
1098
1099 /*
1100 * Loop trying to satisfy the vector of requests.
1101 * If we reach a point where we must wait, any requests already
1102 * performed are rolled back and we go to sleep until some other
1103 * process wakes us up. At this point, we start all over again.
1104 *

--- 285 unchanged lines hidden ---
1082#endif
1083
1084 /*
1085 * Loop trying to satisfy the vector of requests.
1086 * If we reach a point where we must wait, any requests already
1087 * performed are rolled back and we go to sleep until some other
1088 * process wakes us up. At this point, we start all over again.
1089 *

--- 285 unchanged lines hidden ---