Date: Wed, 28 Jun 2006 20:52:10 GMT From: John Baldwin <jhb@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 100232 for review Message-ID: <200606282052.k5SKqAEY058241@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=100232 Change 100232 by jhb@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 {
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200606282052.k5SKqAEY058241>
