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 --- |