PERFORCE change 100232 for review
John Baldwin
jhb at FreeBSD.org
Wed Jun 28 20:52:11 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=100232
Change 100232 by jhb at jhb_mutex on 2006/06/28 20:51:34
- Split up ibcs2_shmsys() and use kern_shmctl() to avoid stackgap
usage.
- Use ibcs2_key_t.
Affected files ...
.. //depot/projects/smpng/sys/i386/ibcs2/ibcs2_ipc.c#11 edit
.. //depot/projects/smpng/sys/i386/ibcs2/ibcs2_ipc.h#4 edit
Differences ...
==== //depot/projects/smpng/sys/i386/ibcs2/ibcs2_ipc.c#11 (text+ko) ====
@@ -105,7 +105,7 @@
struct ibcs2_msgget_args {
int what;
- int key;
+ ibcs2_key_t key;
int msgflg;
};
@@ -344,7 +344,7 @@
struct ibcs2_semget_args {
int what;
- int key;
+ ibcs2_key_t key;
int nsems;
int semflg;
};
@@ -436,66 +436,116 @@
return;
}
-int
-ibcs2_shmsys(td, uap)
- struct thread *td;
- struct ibcs2_shmsys_args *uap;
+struct ibcs2_shmat_args {
+ int what;
+ int shmid;
+ const void *shmaddr;
+ int shmflg;
+};
+
+static int
+ibcs2_shmat(struct thread *td, void *v)
+{
+ struct ibcs2_shmat_args *uap = v;
+ struct shmat_args ap;
+
+ ap.shmid = uap->shmid;
+ ap.shmaddr = uap->shmaddr;
+ ap.shmflg = uap->shmflg;
+ return (shmat(td, &ap));
+}
+
+struct ibcs2_shmctl_args {
+ int what;
+ int shmid;
+ int cmd;
+ struct ibcs2_shmid_ds *buf;
+};
+
+static int
+ibcs2_shmctl(struct thread *td, void *v)
{
+ struct ibcs2_shmctl_args *uap = v;
+ struct ibcs2_shmid_ds is;
+ struct shmid_ds bs;
int error;
- switch (uap->which) {
- case 0: /* shmat */
- return shmsys(td, (struct shmsys_args *)uap);
+ switch(uap->cmd) {
+ case IBCS2_IPC_STAT:
+ error = kern_shmctl(td, uap->shmid, IPC_STAT, &bs, NULL);
+ if (error)
+ return (error);
+ cvt_shmid2ishmid(&bs, &is);
+ return (copyout(&is, uap->buf, sizeof(is)));
+
+ case IBCS2_IPC_SET:
+ error = copyin(uap->buf, &is, sizeof(is));
+ if (error)
+ return (error);
+ cvt_ishmid2shmid(&is, &bs);
+ return (kern_shmctl(td, uap->shmid, IPC_SET, &bs, NULL));
+
+ case IPC_INFO:
+ case SHM_INFO:
+ case SHM_STAT:
+ /* XXX: */
+ return (EINVAL);
+ }
+
+ return (kern_shmctl(td, uap->shmid, uap->cmd, NULL, NULL));
+}
+
+struct ibcs2_shmdt_args {
+ int what;
+ const void *shmaddr;
+};
+
+static int
+ibcs2_shmdt(struct thread *td, void *v)
+{
+ struct ibcs2_shmdt_args *uap = v;
+ struct shmdt_args ap;
- case 1: /* shmctl */
- switch(uap->a3) {
- case IBCS2_IPC_STAT:
- {
- struct ibcs2_shmid_ds *isp;
- struct shmid_ds *sp;
- caddr_t sg = stackgap_init();
+ ap.shmaddr = uap->shmaddr;
+ return (shmdt(td, &ap));
+}
- isp = (struct ibcs2_shmid_ds *)uap->a4;
- sp = stackgap_alloc(&sg, sizeof(*sp));
- uap->a4 = (int)sp;
- error = shmsys(td, (struct shmsys_args *)uap);
- if (!error) {
- uap->a4 = (int)isp;
- isp = stackgap_alloc(&sg, sizeof(*isp));
- cvt_shmid2ishmid(sp, isp);
- error = copyout((caddr_t)isp,
- (caddr_t)uap->a4,
- sizeof(*isp));
- }
- return error;
- }
- case IBCS2_IPC_SET:
- {
- struct ibcs2_shmid_ds *isp;
- struct shmid_ds *sp;
- caddr_t sg = stackgap_init();
+struct ibcs2_shmget_args {
+ int what;
+ ibcs2_key_t key;
+ size_t size;
+ int shmflg;
+};
- isp = stackgap_alloc(&sg, sizeof(*isp));
- sp = stackgap_alloc(&sg, sizeof(*sp));
- error = copyin((caddr_t)uap->a4, (caddr_t)isp,
- sizeof(*isp));
- if (error)
- return error;
- cvt_ishmid2shmid(isp, sp);
- uap->a4 = (int)sp;
- return shmsys(td, (struct shmsys_args *)uap);
- }
- }
+static int
+ibcs2_shmget(struct thread *td, void *v)
+{
+ struct ibcs2_shmget_args *uap = v;
+ struct shmget_args ap;
- return shmsys(td, (struct shmsys_args *)uap);
+ ap.key = uap->key;
+ ap.size = uap->size;
+ ap.shmflg = uap->shmflg;
+ return (shmget(td, &ap));
+}
- case 2: /* shmdt */
- return shmsys(td, (struct shmsys_args *)uap);
+int
+ibcs2_shmsys(td, uap)
+ struct thread *td;
+ struct ibcs2_shmsys_args *uap;
+{
- case 3: /* shmget */
- return shmsys(td, (struct shmsys_args *)uap);
+ switch (uap->which) {
+ case 0:
+ return (ibcs2_shmat(td, uap));
+ case 1:
+ return (ibcs2_shmctl(td, uap));
+ case 2:
+ return (ibcs2_shmdt(td, uap));
+ case 3:
+ return (ibcs2_shmget(td, uap));
}
- return EINVAL;
+ return (EINVAL);
}
MODULE_DEPEND(ibcs2, sysvmsg, 1, 1, 1);
==== //depot/projects/smpng/sys/i386/ibcs2/ibcs2_ipc.h#4 (text+ko) ====
@@ -38,7 +38,7 @@
u_short cgid; /* creator group id */
u_short mode; /* r/w permission */
u_short seq; /* sequence # (to generate unique msg/sem/shm id) */
- key_t key; /* user specified msg/sem/shm key */
+ ibcs2_key_t key; /* user specified msg/sem/shm key */
};
struct ibcs2_msqid_ds {
More information about the p4-projects
mailing list