Annotation of sys/compat/common/kern_ipc_23.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: kern_ipc_23.c,v 1.5 2004/07/15 11:25:59 millert Exp $ */
! 2:
! 3: /*
! 4: * Copyright (c) 2004 Todd C. Miller <Todd.Miller@courtesan.com>
! 5: *
! 6: * Permission to use, copy, modify, and distribute this software for any
! 7: * purpose with or without fee is hereby granted, provided that the above
! 8: * copyright notice and this permission notice appear in all copies.
! 9: *
! 10: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
! 11: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
! 12: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
! 13: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
! 14: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
! 15: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
! 16: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
! 17: */
! 18:
! 19: #include <sys/param.h>
! 20: #include <sys/systm.h>
! 21: #include <sys/kernel.h>
! 22: #include <sys/proc.h>
! 23: #include <sys/msg.h>
! 24: #include <sys/sem.h>
! 25: #include <sys/shm.h>
! 26:
! 27: #include <sys/mount.h>
! 28: #include <sys/syscallargs.h>
! 29:
! 30: /*
! 31: * Convert between new and old struct {msq,sem,shm}id_ds (both ways)
! 32: */
! 33: #if defined(SYSVMSG) || defined(SYSVSEM) || defined(SYSVSHM)
! 34: #define cvt_ds(to, from, type, base) do { \
! 35: (to)->type##_perm.cuid = (from)->type##_perm.cuid; \
! 36: (to)->type##_perm.cgid = (from)->type##_perm.cgid; \
! 37: (to)->type##_perm.uid = (from)->type##_perm.uid; \
! 38: (to)->type##_perm.gid = (from)->type##_perm.gid; \
! 39: (to)->type##_perm.mode = (from)->type##_perm.mode & 0xffffU; \
! 40: (to)->type##_perm.seq = (from)->type##_perm.seq; \
! 41: (to)->type##_perm.key = (from)->type##_perm.key; \
! 42: bcopy((caddr_t)&(from)->base, (caddr_t)&(to)->base, \
! 43: sizeof(*(to)) - ((caddr_t)&(to)->base - (caddr_t)to)); \
! 44: } while (0)
! 45: #endif /* SYSVMSG || SYSVSEM || SYSVSHM */
! 46:
! 47: #ifdef SYSVMSG
! 48: /*
! 49: * Copy a struct msqid_ds23 from userland and convert to struct msqid_ds
! 50: */
! 51: static int
! 52: msqid_copyin(const void *uaddr, void *kaddr, size_t len)
! 53: {
! 54: struct msqid_ds *msqbuf = kaddr;
! 55: struct msqid_ds23 omsqbuf;
! 56: int error;
! 57:
! 58: if (len != sizeof(struct msqid_ds))
! 59: return (EFAULT);
! 60: if ((error = copyin(uaddr, &omsqbuf, sizeof(omsqbuf))) == 0)
! 61: cvt_ds(msqbuf, &omsqbuf, msg, msg_first);
! 62: return (error);
! 63: }
! 64:
! 65: /*
! 66: * Convert a struct msqid_ds to struct msqid_ds23 and copy to userland
! 67: */
! 68: static int
! 69: msqid_copyout(const void *kaddr, void *uaddr, size_t len)
! 70: {
! 71: const struct msqid_ds *msqbuf = kaddr;
! 72: struct msqid_ds23 omsqbuf;
! 73:
! 74: if (len != sizeof(struct msqid_ds))
! 75: return (EFAULT);
! 76: cvt_ds(&omsqbuf, msqbuf, msg, msg_first);
! 77: return (copyout(&omsqbuf, uaddr, sizeof(omsqbuf)));
! 78: }
! 79:
! 80: /*
! 81: * OpenBSD 2.3 msgctl(2) with 16bit values in struct ipcperm.
! 82: */
! 83: int
! 84: compat_23_sys_msgctl(struct proc *p, void *v, register_t *retval)
! 85: {
! 86: struct compat_23_sys_msgctl_args /* {
! 87: syscallarg(int) msqid;
! 88: syscallarg(int) cmd;
! 89: syscallarg(struct msqid_ds23 *) buf;
! 90: } */ *uap = v;
! 91:
! 92: return (msgctl1(p, SCARG(uap, msqid), SCARG(uap, cmd),
! 93: (caddr_t)SCARG(uap, buf), msqid_copyin, msqid_copyout));
! 94: }
! 95: #endif /* SYSVMSG */
! 96:
! 97: #ifdef SYSVSEM
! 98: /*
! 99: * Copy a struct semid_ds23 from userland and convert to struct semid_ds
! 100: */
! 101: static int
! 102: semid_copyin(const void *uaddr, void *kaddr, size_t len)
! 103: {
! 104: struct semid_ds *sembuf = kaddr;
! 105: struct semid_ds23 osembuf;
! 106: int error;
! 107:
! 108: if (len != sizeof(struct semid_ds))
! 109: return (EFAULT);
! 110: if ((error = copyin(uaddr, &osembuf, sizeof(osembuf))) == 0)
! 111: cvt_ds(sembuf, &osembuf, sem, sem_base);
! 112: return (error);
! 113: }
! 114:
! 115: /*
! 116: * Convert a struct semid_ds to struct semid_ds23 and copy to userland
! 117: */
! 118: static int
! 119: semid_copyout(const void *kaddr, void *uaddr, size_t len)
! 120: {
! 121: const struct semid_ds *sembuf = kaddr;
! 122: struct semid_ds23 osembuf;
! 123:
! 124: if (len != sizeof(struct semid_ds))
! 125: return (EFAULT);
! 126: cvt_ds(&osembuf, sembuf, sem, sem_base);
! 127: return (copyout(&osembuf, uaddr, sizeof(osembuf)));
! 128: }
! 129:
! 130: /*
! 131: * OpenBSD 2.3 semctl(2) with 16bit values in struct ipcperm.
! 132: */
! 133: int
! 134: compat_23_sys___semctl(struct proc *p, void *v, register_t *retval)
! 135: {
! 136: struct compat_23_sys___semctl_args /* {
! 137: syscallarg(int) semid;
! 138: syscallarg(int) semnum;
! 139: syscallarg(int) cmd;
! 140: syscallarg(union semun *) arg;
! 141: } */ *uap = v;
! 142: union semun arg;
! 143: int error = 0, cmd = SCARG(uap, cmd);
! 144:
! 145: switch (cmd) {
! 146: case IPC_SET:
! 147: case IPC_STAT:
! 148: case GETALL:
! 149: case SETVAL:
! 150: case SETALL:
! 151: error = copyin(SCARG(uap, arg), &arg, sizeof(arg));
! 152: break;
! 153: }
! 154: if (error == 0) {
! 155: error = semctl1(p, SCARG(uap, semid), SCARG(uap, semnum),
! 156: cmd, &arg, retval, semid_copyin, semid_copyout);
! 157: }
! 158: return (error);
! 159: }
! 160: #endif /* SYSVSEM */
! 161:
! 162: #ifdef SYSVSHM
! 163: /*
! 164: * Copy a struct shmid_ds23 from userland and convert to struct shmid_ds
! 165: */
! 166: static int
! 167: shmid_copyin(const void *uaddr, void *kaddr, size_t len)
! 168: {
! 169: struct shmid_ds *shmbuf = kaddr;
! 170: struct shmid_ds23 oshmbuf;
! 171: int error;
! 172:
! 173: if (len != sizeof(struct shmid_ds))
! 174: return (EFAULT);
! 175: if ((error = copyin(uaddr, &oshmbuf, sizeof(oshmbuf))) == 0)
! 176: cvt_ds(shmbuf, &oshmbuf, shm, shm_segsz);
! 177: return (error);
! 178: }
! 179:
! 180: /*
! 181: * Convert a struct shmid_ds to struct shmid_ds23 and copy to userland
! 182: */
! 183: static int
! 184: shmid_copyout(const void *kaddr, void *uaddr, size_t len)
! 185: {
! 186: const struct shmid_ds *shmbuf = kaddr;
! 187: struct shmid_ds23 oshmbuf;
! 188:
! 189: if (len != sizeof(struct shmid_ds))
! 190: return (EFAULT);
! 191: cvt_ds(&oshmbuf, shmbuf, shm, shm_segsz);
! 192: return (copyout(&oshmbuf, uaddr, sizeof(oshmbuf)));
! 193: }
! 194:
! 195: /*
! 196: * OpenBSD 2.3 shmctl(2) with 16bit values in struct ipcperm.
! 197: */
! 198: int
! 199: compat_23_sys_shmctl(struct proc *p, void *v, register_t *retval)
! 200: {
! 201: struct compat_23_sys_shmctl_args /* {
! 202: syscallarg(int) shmid;
! 203: syscallarg(int) cmd;
! 204: syscallarg(struct shmid_ds23 *) buf;
! 205: } */ *uap = v;
! 206:
! 207: return (shmctl1(p, SCARG(uap, shmid), SCARG(uap, cmd),
! 208: (caddr_t)SCARG(uap, buf), shmid_copyin, shmid_copyout));
! 209: }
! 210: #endif /* SYSVSHM */
CVSweb