Annotation of sys/compat/common/kern_ipc_35.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: kern_ipc_35.c,v 1.3 2004/07/15 11:00:12 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: #ifdef SYSVMSG
! 31: /*
! 32: * Old-style shmget(2) used int for the size parameter, we now use size_t.
! 33: */
! 34: int
! 35: compat_35_sys_shmget(struct proc *p, void *v, register_t *retval)
! 36: {
! 37: struct compat_35_sys_shmget_args /* {
! 38: syscallarg(key_t) key;
! 39: syscallarg(int) size;
! 40: syscallarg(int) shmflg;
! 41: } */ *uap = v;
! 42: struct sys_shmget_args /* {
! 43: syscallarg(key_t) key;
! 44: syscallarg(size_t) size;
! 45: syscallarg(int) shmflg;
! 46: } */ shmget_args;
! 47:
! 48: SCARG(&shmget_args, key) = SCARG(uap, key);
! 49: SCARG(&shmget_args, size) = (size_t)SCARG(uap, size);
! 50: SCARG(&shmget_args, shmflg) = SCARG(uap, shmflg);
! 51:
! 52: return (sys_shmget(p, &shmget_args, retval));
! 53: }
! 54: #endif
! 55:
! 56: #ifdef SYSVSEM
! 57: /*
! 58: * Old-style shmget(2) used u_int for the nsops parameter, we now use size_t.
! 59: */
! 60: int
! 61: compat_35_sys_semop(struct proc *p, void *v, register_t *retval)
! 62: {
! 63: struct compat_35_sys_semop_args /* {
! 64: syscallarg(int) semid;
! 65: syscallarg(struct sembuf *) sops;
! 66: syscallarg(u_int) nsops;
! 67: } */ *uap = v;
! 68: struct sys_semop_args /* {
! 69: syscallarg(int) semid;
! 70: syscallarg(struct sembuf *) sops;
! 71: syscallarg(size_t) nsops;
! 72: } */ semop_args;
! 73:
! 74: SCARG(&semop_args, semid) = SCARG(uap, semid);
! 75: SCARG(&semop_args, sops) = SCARG(uap, sops);
! 76: SCARG(&semop_args, nsops) = (size_t)SCARG(uap, nsops);
! 77:
! 78: return (sys_semop(p, &semop_args, retval));
! 79: }
! 80: #endif
! 81:
! 82: /*
! 83: * Convert between new and old struct {msq,sem,shm}id_ds (both ways)
! 84: */
! 85: #if defined(SYSVMSG) || defined(SYSVSEM) || defined(SYSVSHM)
! 86: #define cvt_ds(to, from, type, base) do { \
! 87: (to)->type##_perm.cuid = (from)->type##_perm.cuid; \
! 88: (to)->type##_perm.cgid = (from)->type##_perm.cgid; \
! 89: (to)->type##_perm.uid = (from)->type##_perm.uid; \
! 90: (to)->type##_perm.gid = (from)->type##_perm.gid; \
! 91: (to)->type##_perm.mode = (from)->type##_perm.mode & 0xffffU; \
! 92: (to)->type##_perm.seq = (from)->type##_perm.seq; \
! 93: (to)->type##_perm.key = (from)->type##_perm.key; \
! 94: bcopy((caddr_t)&(from)->base, (caddr_t)&(to)->base, \
! 95: sizeof(*(to)) - ((caddr_t)&(to)->base - (caddr_t)to)); \
! 96: } while (0)
! 97: #endif /* SYSVMSG || SYSVSEM || SYSVSHM */
! 98:
! 99: #ifdef SYSVMSG
! 100: /*
! 101: * Copy a struct msqid_ds35 from userland and convert to struct msqid_ds
! 102: */
! 103: static int
! 104: msqid_copyin(const void *uaddr, void *kaddr, size_t len)
! 105: {
! 106: struct msqid_ds *msqbuf = kaddr;
! 107: struct msqid_ds35 omsqbuf;
! 108: int error;
! 109:
! 110: if (len != sizeof(struct msqid_ds))
! 111: return (EFAULT);
! 112: if ((error = copyin(uaddr, &omsqbuf, sizeof(omsqbuf))) == 0)
! 113: cvt_ds(msqbuf, &omsqbuf, msg, msg_first);
! 114: return (error);
! 115: }
! 116:
! 117: /*
! 118: * Convert a struct msqid_ds to struct msqid_ds35 and copy to userland
! 119: */
! 120: static int
! 121: msqid_copyout(const void *kaddr, void *uaddr, size_t len)
! 122: {
! 123: const struct msqid_ds *msqbuf = kaddr;
! 124: struct msqid_ds35 omsqbuf;
! 125:
! 126: if (len != sizeof(struct msqid_ds))
! 127: return (EFAULT);
! 128: cvt_ds(&omsqbuf, msqbuf, msg, msg_first);
! 129: return (copyout(&omsqbuf, uaddr, sizeof(omsqbuf)));
! 130: }
! 131:
! 132: /*
! 133: * OpenBSD 3.5 msgctl(2) with 16bit mode_t in struct ipcperm.
! 134: */
! 135: int
! 136: compat_35_sys_msgctl(struct proc *p, void *v, register_t *retval)
! 137: {
! 138: struct compat_35_sys_msgctl_args /* {
! 139: syscallarg(int) msqid;
! 140: syscallarg(int) cmd;
! 141: syscallarg(struct msqid_ds35 *) buf;
! 142: } */ *uap = v;
! 143:
! 144: return (msgctl1(p, SCARG(uap, msqid), SCARG(uap, cmd),
! 145: (caddr_t)SCARG(uap, buf), msqid_copyin, msqid_copyout));
! 146: }
! 147: #endif /* SYSVMSG */
! 148:
! 149: #ifdef SYSVSEM
! 150: /*
! 151: * Copy a struct semid_ds35 from userland and convert to struct semid_ds
! 152: */
! 153: static int
! 154: semid_copyin(const void *uaddr, void *kaddr, size_t len)
! 155: {
! 156: struct semid_ds *sembuf = kaddr;
! 157: struct semid_ds35 osembuf;
! 158: int error;
! 159:
! 160: if (len != sizeof(struct semid_ds))
! 161: return (EFAULT);
! 162: if ((error = copyin(uaddr, &osembuf, sizeof(osembuf))) == 0)
! 163: cvt_ds(sembuf, &osembuf, sem, sem_base);
! 164: return (error);
! 165: }
! 166:
! 167: /*
! 168: * Convert a struct semid_ds to struct semid_ds35 and copy to userland
! 169: */
! 170: static int
! 171: semid_copyout(const void *kaddr, void *uaddr, size_t len)
! 172: {
! 173: const struct semid_ds *sembuf = kaddr;
! 174: struct semid_ds35 osembuf;
! 175:
! 176: if (len != sizeof(struct semid_ds))
! 177: return (EFAULT);
! 178: cvt_ds(&osembuf, sembuf, sem, sem_base);
! 179: return (copyout(&osembuf, uaddr, sizeof(osembuf)));
! 180: }
! 181:
! 182: /*
! 183: * OpenBSD 3.5 semctl(2) with 16bit mode_t in struct ipcperm.
! 184: */
! 185: int
! 186: compat_35_sys___semctl(struct proc *p, void *v, register_t *retval)
! 187: {
! 188: struct compat_35_sys___semctl_args /* {
! 189: syscallarg(int) semid;
! 190: syscallarg(int) semnum;
! 191: syscallarg(int) cmd;
! 192: syscallarg(union semun *) arg;
! 193: } */ *uap = v;
! 194: union semun arg;
! 195: int error = 0, cmd = SCARG(uap, cmd);
! 196:
! 197: switch (cmd) {
! 198: case IPC_SET:
! 199: case IPC_STAT:
! 200: case GETALL:
! 201: case SETVAL:
! 202: case SETALL:
! 203: error = copyin(SCARG(uap, arg), &arg, sizeof(arg));
! 204: break;
! 205: }
! 206: if (error == 0) {
! 207: error = semctl1(p, SCARG(uap, semid), SCARG(uap, semnum),
! 208: cmd, &arg, retval, semid_copyin, semid_copyout);
! 209: }
! 210: return (error);
! 211: }
! 212: #endif /* SYSVSEM */
! 213:
! 214: #ifdef SYSVSHM
! 215: /*
! 216: * Copy a struct shmid_ds35 from userland and convert to struct shmid_ds
! 217: */
! 218: static int
! 219: shmid_copyin(const void *uaddr, void *kaddr, size_t len)
! 220: {
! 221: struct shmid_ds *shmbuf = kaddr;
! 222: struct shmid_ds35 oshmbuf;
! 223: int error;
! 224:
! 225: if (len != sizeof(struct shmid_ds))
! 226: return (EFAULT);
! 227: if ((error = copyin(uaddr, &oshmbuf, sizeof(oshmbuf))) == 0)
! 228: cvt_ds(shmbuf, &oshmbuf, shm, shm_segsz);
! 229: return (error);
! 230: }
! 231:
! 232: /*
! 233: * Convert a struct shmid_ds to struct shmid_ds35 and copy to userland
! 234: */
! 235: static int
! 236: shmid_copyout(const void *kaddr, void *uaddr, size_t len)
! 237: {
! 238: const struct shmid_ds *shmbuf = kaddr;
! 239: struct shmid_ds35 oshmbuf;
! 240:
! 241: if (len != sizeof(struct shmid_ds))
! 242: return (EFAULT);
! 243: cvt_ds(&oshmbuf, shmbuf, shm, shm_segsz);
! 244: return (copyout(&oshmbuf, uaddr, sizeof(oshmbuf)));
! 245: }
! 246:
! 247: /*
! 248: * OpenBSD 3.5 shmctl(2) with 16bit mode_t in struct ipcperm.
! 249: */
! 250: int
! 251: compat_35_sys_shmctl(struct proc *p, void *v, register_t *retval)
! 252: {
! 253: struct compat_35_sys_shmctl_args /* {
! 254: syscallarg(int) shmid;
! 255: syscallarg(int) cmd;
! 256: syscallarg(struct shmid_ds35 *) buf;
! 257: } */ *uap = v;
! 258:
! 259: return (shmctl1(p, SCARG(uap, shmid), SCARG(uap, cmd),
! 260: (caddr_t)SCARG(uap, buf), shmid_copyin, shmid_copyout));
! 261: }
! 262: #endif /* SYSVSHM */
CVSweb