patch-2.4.21 linux-2.4.21/arch/x86_64/ia32/ipc32.c
Next file: linux-2.4.21/arch/x86_64/ia32/ptrace32.c
Previous file: linux-2.4.21/arch/x86_64/ia32/ia32entry.S
Back to the patch index
Back to the overall index
- Lines: 133
- Date:
2003-06-13 07:51:32.000000000 -0700
- Orig file:
linux-2.4.20/arch/x86_64/ia32/ipc32.c
- Orig date:
2002-11-28 15:53:12.000000000 -0800
diff -urN linux-2.4.20/arch/x86_64/ia32/ipc32.c linux-2.4.21/arch/x86_64/ia32/ipc32.c
@@ -185,12 +185,58 @@
}
}
+static int put_semid(void *user_semid, struct semid64_ds *s, int version)
+{
+ int err2;
+ switch (version) {
+ case IPC_64: {
+ struct semid64_ds32 *usp64 = (struct semid64_ds32 *) user_semid;
+
+ if (!access_ok(VERIFY_WRITE, usp64, sizeof(*usp64))) {
+ err2 = -EFAULT;
+ break;
+ }
+ err2 = __put_user(s->sem_perm.key, &usp64->sem_perm.key);
+ err2 |= __put_user(s->sem_perm.uid, &usp64->sem_perm.uid);
+ err2 |= __put_user(s->sem_perm.gid, &usp64->sem_perm.gid);
+ err2 |= __put_user(s->sem_perm.cuid, &usp64->sem_perm.cuid);
+ err2 |= __put_user(s->sem_perm.cgid, &usp64->sem_perm.cgid);
+ err2 |= __put_user(s->sem_perm.mode, &usp64->sem_perm.mode);
+ err2 |= __put_user(s->sem_perm.seq, &usp64->sem_perm.seq);
+ err2 |= __put_user(s->sem_otime, &usp64->sem_otime);
+ err2 |= __put_user(s->sem_ctime, &usp64->sem_ctime);
+ err2 |= __put_user(s->sem_nsems, &usp64->sem_nsems);
+ break;
+ }
+ default: {
+ struct semid_ds32 *usp32 = (struct semid_ds32 *) user_semid;
+
+ if (!access_ok(VERIFY_WRITE, usp32, sizeof(*usp32))) {
+ err2 = -EFAULT;
+ break;
+ }
+ err2 = __put_user(s->sem_perm.key, &usp32->sem_perm.key);
+ err2 |= __put_user(s->sem_perm.uid, &usp32->sem_perm.uid);
+ err2 |= __put_user(s->sem_perm.gid, &usp32->sem_perm.gid);
+ err2 |= __put_user(s->sem_perm.cuid, &usp32->sem_perm.cuid);
+ err2 |= __put_user(s->sem_perm.cgid, &usp32->sem_perm.cgid);
+ err2 |= __put_user(s->sem_perm.mode, &usp32->sem_perm.mode);
+ err2 |= __put_user(s->sem_perm.seq, &usp32->sem_perm.seq);
+ err2 |= __put_user(s->sem_otime, &usp32->sem_otime);
+ err2 |= __put_user(s->sem_ctime, &usp32->sem_ctime);
+ err2 |= __put_user(s->sem_nsems, &usp32->sem_nsems);
+ break;
+ }
+ }
+ return err2;
+}
+
static int
semctl32 (int first, int second, int third, void *uptr)
{
union semun fourth;
u32 pad;
- int err = 0, err2;
+ int err = 0;
struct semid64_ds s;
mm_segment_t old_fs;
int version = ipc_parse_version32(&third);
@@ -223,46 +269,15 @@
fourth.__pad = &s;
old_fs = get_fs();
set_fs(KERNEL_DS);
- err = sys_semctl(first, second|IPC_64, third, fourth);
+ err = sys_semctl(first, second, third|IPC_64, fourth);
set_fs(old_fs);
- if (version == IPC_64) {
- struct semid64_ds32 *usp64 = (struct semid64_ds32 *) A(pad);
-
- if (!access_ok(VERIFY_WRITE, usp64, sizeof(*usp64))) {
- err = -EFAULT;
- break;
- }
- err2 = __put_user(s.sem_perm.key, &usp64->sem_perm.key);
- err2 |= __put_user(s.sem_perm.uid, &usp64->sem_perm.uid);
- err2 |= __put_user(s.sem_perm.gid, &usp64->sem_perm.gid);
- err2 |= __put_user(s.sem_perm.cuid, &usp64->sem_perm.cuid);
- err2 |= __put_user(s.sem_perm.cgid, &usp64->sem_perm.cgid);
- err2 |= __put_user(s.sem_perm.mode, &usp64->sem_perm.mode);
- err2 |= __put_user(s.sem_perm.seq, &usp64->sem_perm.seq);
- err2 |= __put_user(s.sem_otime, &usp64->sem_otime);
- err2 |= __put_user(s.sem_ctime, &usp64->sem_ctime);
- err2 |= __put_user(s.sem_nsems, &usp64->sem_nsems);
- } else {
- struct semid_ds32 *usp32 = (struct semid_ds32 *) A(pad);
+ if (!err)
+ err = put_semid((void *)A(pad), &s, version);
- if (!access_ok(VERIFY_WRITE, usp32, sizeof(*usp32))) {
- err = -EFAULT;
- break;
- }
- err2 = __put_user(s.sem_perm.key, &usp32->sem_perm.key);
- err2 |= __put_user(s.sem_perm.uid, &usp32->sem_perm.uid);
- err2 |= __put_user(s.sem_perm.gid, &usp32->sem_perm.gid);
- err2 |= __put_user(s.sem_perm.cuid, &usp32->sem_perm.cuid);
- err2 |= __put_user(s.sem_perm.cgid, &usp32->sem_perm.cgid);
- err2 |= __put_user(s.sem_perm.mode, &usp32->sem_perm.mode);
- err2 |= __put_user(s.sem_perm.seq, &usp32->sem_perm.seq);
- err2 |= __put_user(s.sem_otime, &usp32->sem_otime);
- err2 |= __put_user(s.sem_ctime, &usp32->sem_ctime);
- err2 |= __put_user(s.sem_nsems, &usp32->sem_nsems);
- }
- if (err2)
- err = -EFAULT;
+ break;
+ default:
+ err = -EINVAL;
break;
}
return err;
@@ -284,7 +299,7 @@
if (!p)
return -ENOMEM;
err = get_user(p->mtype, &up->mtype);
- err |= copy_from_user(p->mtext, &up->mtext, second);
+ err |= (copy_from_user(p->mtext, &up->mtext, second) ? -EFAULT : 0);
if (err)
goto out;
old_fs = get_fs();
@@ -604,6 +619,10 @@
err = -EFAULT;
break;
+ default:
+ err = -EINVAL;
+ break;
+
}
return err;
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)