From 5d3b35b0fbc7625129285983de5850d6d3a2c4b5 Mon Sep 17 00:00:00 2001 From: jhb Date: Tue, 27 Jun 2006 18:31:36 +0000 Subject: Use kern_shmctl() in svr4_sys_shmctl() and drop use of the stackgap. Mark svr4_sys_shmctl() MPSAFE. --- sys/compat/svr4/svr4_ipc.c | 77 +++++++++++++++++------------------------ sys/compat/svr4/syscalls.master | 2 +- 2 files changed, 32 insertions(+), 47 deletions(-) (limited to 'sys/compat/svr4') diff --git a/sys/compat/svr4/svr4_ipc.c b/sys/compat/svr4/svr4_ipc.c index 9eeaf24..64216ba 100644 --- a/sys/compat/svr4/svr4_ipc.c +++ b/sys/compat/svr4/svr4_ipc.c @@ -650,76 +650,61 @@ svr4_shmctl(td, v) void *v; { struct svr4_sys_shmctl_args *uap = v; - int error; - caddr_t sg = stackgap_init(); - struct shmctl_args ap; struct shmid_ds bs; struct svr4_shmid_ds ss; - - ap.shmid = uap->shmid; + size_t bufsize; + int cmd, error; if (uap->buf != NULL) { - ap.buf = stackgap_alloc(&sg, sizeof (struct shmid_ds)); switch (uap->cmd) { case SVR4_IPC_SET: case SVR4_IPC_RMID: case SVR4_SHM_LOCK: case SVR4_SHM_UNLOCK: - error = copyin(uap->buf, (caddr_t) &ss, - sizeof ss); + error = copyin(uap->buf, &ss, sizeof(ss)); if (error) - return error; + return (error); svr4_to_bsd_shmid_ds(&ss, &bs); - error = copyout(&bs, ap.buf, sizeof bs); - if (error) - return error; break; default: - break; + return (EINVAL); } } - else - ap.buf = NULL; - switch (uap->cmd) { case SVR4_IPC_STAT: - ap.cmd = IPC_STAT; - if ((error = shmctl(td, &ap)) != 0) - return error; - if (uap->buf == NULL) - return 0; - error = copyin(&bs, ap.buf, sizeof bs); - if (error) - return error; - bsd_to_svr4_shmid_ds(&bs, &ss); - return copyout(&ss, uap->buf, sizeof ss); - + cmd = IPC_STAT; + break; case SVR4_IPC_SET: - ap.cmd = IPC_SET; - return shmctl(td, &ap); - + cmd = IPC_SET; + break; case SVR4_IPC_RMID: + cmd = IPC_RMID; + break; case SVR4_SHM_LOCK: + cmd = SHM_LOCK; + break; case SVR4_SHM_UNLOCK: - switch (uap->cmd) { - case SVR4_IPC_RMID: - ap.cmd = IPC_RMID; - break; - case SVR4_SHM_LOCK: - ap.cmd = SHM_LOCK; - break; - case SVR4_SHM_UNLOCK: - ap.cmd = SHM_UNLOCK; - break; - default: - return EINVAL; - } - return shmctl(td, &ap); - + cmd = SHM_UNLOCK; + break; default: - return EINVAL; + return (EINVAL); } + + error = kern_shmctl(td, uap->shmid, cmd, &bs, &bufsize); + if (error) + return (error); + + switch (uap->cmd) { + case SVR4_IPC_STAT: + if (uap->buf != NULL) { + bsd_to_svr4_shmid_ds(&bs, &ss); + error = copyout(&ss, uap->buf, sizeof(ss)); + } + break; + } + + return (error); } int diff --git a/sys/compat/svr4/syscalls.master b/sys/compat/svr4/syscalls.master index 944ec75..32a1541 100644 --- a/sys/compat/svr4/syscalls.master +++ b/sys/compat/svr4/syscalls.master @@ -100,7 +100,7 @@ int a3, int a4, int a5); } 50 AUE_NULL MSTD { int svr4_sys_sysarch(int op, void *a1); } 51 AUE_NULL UNIMPL acct -52 AUE_NULL STD { int svr4_sys_shmsys(int what, int a2, \ +52 AUE_NULL MSTD { int svr4_sys_shmsys(int what, int a2, \ int a3, int a4, int a5); } 53 AUE_NULL MSTD { int svr4_sys_semsys(int what, int a2, \ int a3, int a4, int a5); } -- cgit v1.1