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