1 /* $FreeBSD: src/sys/kern/sysv_ipc.c,v 1.13.2.2 2000/07/01 14:33:49 bsd Exp $ */ 2 /* $NetBSD: sysv_ipc.c,v 1.7 1994/06/29 06:33:11 cgd Exp $ */ 3 4 /* 5 * Copyright (c) 1994 Herb Peyerl <hpeyerl@novatel.ca> 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. All advertising materials mentioning features or use of this software 17 * must display the following acknowledgement: 18 * This product includes software developed by Herb Peyerl. 19 * 4. The name of Herb Peyerl may not be used to endorse or promote products 20 * derived from this software without specific prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 25 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 27 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 31 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34 #include "opt_sysvipc.h" 35 36 #include <sys/param.h> 37 #include <sys/ipc.h> 38 #include <sys/proc.h> 39 #include <sys/priv.h> 40 #include <sys/ucred.h> 41 42 #define SYSCALL_NOT_PRESENT_GEN(SC, str) \ 43 int sys_##SC (struct SC##_args *uap) \ 44 { \ 45 sysv_nosys(str); \ 46 return sys_nosys((struct nosys_args *)uap); \ 47 } 48 49 #if defined(SYSVSEM) || defined(SYSVSHM) || defined(SYSVMSG) 50 51 /* 52 * Check for ipc permission 53 */ 54 55 int 56 ipcperm(struct proc *p, struct ipc_perm *perm, int mode) 57 { 58 struct ucred *cred = p->p_ucred; 59 60 /* Check for user match. */ 61 if (cred->cr_uid != perm->cuid && cred->cr_uid != perm->uid) { 62 if (mode & IPC_M) 63 return (priv_check_cred(cred, PRIV_ROOT, 0) == 0 ? 0 : EPERM); 64 /* Check for group match. */ 65 mode >>= 3; 66 if (!groupmember(perm->gid, cred) && 67 !groupmember(perm->cgid, cred)) 68 /* Check for `other' match. */ 69 mode >>= 3; 70 } 71 72 if (mode & IPC_M) 73 return (0); 74 return ((mode & perm->mode) == mode || 75 priv_check_cred(cred, PRIV_ROOT, 0) == 0 ? 0 : EACCES); 76 } 77 78 #endif /* defined(SYSVSEM) || defined(SYSVSHM) || defined(SYSVMSG) */ 79 80 81 #if !defined(SYSVSEM) || !defined(SYSVSHM) || !defined(SYSVMSG) 82 83 #include <sys/proc.h> 84 #include <sys/sem.h> 85 #include <sys/shm.h> 86 #include <sys/syslog.h> 87 #include <sys/sysproto.h> 88 #include <sys/systm.h> 89 90 static void sysv_nosys (char *s); 91 92 static void 93 sysv_nosys(char *s) 94 { 95 struct thread *td = curthread; 96 struct proc *p = td->td_proc; 97 98 log(LOG_ERR, "cmd %s pid %d tried to use non-present %s\n", 99 (p ? p->p_comm : td->td_comm), 100 (p ? p->p_pid : -1), s); 101 } 102 103 #if !defined(SYSVSEM) 104 105 /* 106 * SYSVSEM stubs 107 */ 108 109 SYSCALL_NOT_PRESENT_GEN(__semctl, "SYSVSEM"); 110 SYSCALL_NOT_PRESENT_GEN(semget, "SYSVSEM"); 111 SYSCALL_NOT_PRESENT_GEN(semop, "SYSVSEM"); 112 113 /* called from kern_exit.c */ 114 void 115 semexit(struct proc *p) 116 { 117 /* empty */ 118 } 119 120 #endif /* !defined(SYSVSEM) */ 121 122 123 #if !defined(SYSVMSG) 124 125 /* 126 * SYSVMSG stubs 127 */ 128 129 SYSCALL_NOT_PRESENT_GEN(msgctl, "SYSVMSG"); 130 SYSCALL_NOT_PRESENT_GEN(msgget, "SYSVMSG"); 131 SYSCALL_NOT_PRESENT_GEN(msgsnd, "SYSVMSG"); 132 SYSCALL_NOT_PRESENT_GEN(msgrcv, "SYSVMSG"); 133 134 #endif /* !defined(SYSVMSG) */ 135 136 137 #if !defined(SYSVSHM) 138 139 /* 140 * SYSVSHM stubs 141 */ 142 143 SYSCALL_NOT_PRESENT_GEN(shmdt, "SYSVSHM"); 144 SYSCALL_NOT_PRESENT_GEN(shmat, "SYSVSHM"); 145 SYSCALL_NOT_PRESENT_GEN(shmctl, "SYSVSHM"); 146 SYSCALL_NOT_PRESENT_GEN(shmget, "SYSVSHM"); 147 148 /* called from kern_fork.c */ 149 void 150 shmfork(struct proc *p1, struct proc *p2) 151 { 152 /* empty */ 153 } 154 155 /* called from kern_exit.c */ 156 void 157 shmexit(struct vmspace *vm) 158 { 159 /* empty */ 160 } 161 162 #endif /* !defined(SYSVSHM) */ 163 164 #endif /* !defined(SYSVSEM) || !defined(SYSVSHM) || !defined(SYSVMSG) */ 165