1) Fix our view of how ibcs2_semid_ds looks. There is no padding int there

(SVR4 does have it so that;s probably the cause of this bug)
2) Add a wrapper function for translation between ibcs2_ipc_perm and
ipc_perm as I think we screwed up when defining the ipc_perm struct and
mixed up 'normal' and creator [ug]id's
3) Fix IBCS2_IPC_STAT semctl. The FreeBSD version needs a union semun
whereas the IBCS2 version gives a struct ibcs2_semid_ds.

Apparently this is all fixed in the SVR4 compatibility code.
PR:		7729
This commit is contained in:
Guido van Rooij 1999-02-07 19:35:40 +00:00
parent 10c76ef5a2
commit e9e3bfdf42
2 changed files with 46 additions and 13 deletions

View File

@ -22,7 +22,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: ibcs2_ipc.c,v 1.12 1997/07/20 09:39:42 bde Exp $
* $Id: ibcs2_ipc.c,v 1.13 1997/11/06 19:28:28 phk Exp $
*/
#include <sys/param.h>
@ -55,6 +55,8 @@ static void cvt_semid2isemid __P((struct semid_ds *, struct ibcs2_semid_ds *));
static void cvt_isemid2semid __P((struct ibcs2_semid_ds *, struct semid_ds *));
static void cvt_shmid2ishmid __P((struct shmid_ds *, struct ibcs2_shmid_ds *));
static void cvt_ishmid2shmid __P((struct ibcs2_shmid_ds *, struct shmid_ds *));
static void cvt_perm2iperm __P((struct ipc_perm *, struct ibcs2_ipc_perm *));
static void cvt_iperm2perm __P((struct ibcs2_ipc_perm *, struct ipc_perm *));
/*
@ -66,7 +68,7 @@ cvt_msqid2imsqid(bp, ibp)
struct msqid_ds *bp;
struct ibcs2_msqid_ds *ibp;
{
ibp->msg_perm = bp->msg_perm;
cvt_perm2iperm(&bp->msg_perm, &ibp->msg_perm);
ibp->msg_first = bp->msg_first;
ibp->msg_last = bp->msg_last;
ibp->msg_cbytes = (u_short)bp->msg_cbytes;
@ -85,7 +87,7 @@ cvt_imsqid2msqid(ibp, bp)
struct ibcs2_msqid_ds *ibp;
struct msqid_ds *bp;
{
bp->msg_perm = ibp->msg_perm;
cvt_iperm2perm(&ibp->msg_perm, &bp->msg_perm);
bp->msg_first = ibp->msg_first;
bp->msg_last = ibp->msg_last;
bp->msg_cbytes = ibp->msg_cbytes;
@ -176,12 +178,40 @@ struct sem *bp;
}
#endif
static void
cvt_iperm2perm(ipp, pp)
struct ibcs2_ipc_perm *ipp;
struct ipc_perm *pp;
{
pp->uid = ipp->uid;
pp->gid = ipp->gid;
pp->cuid = ipp->cuid;
pp->cgid = ipp->cgid;
pp->mode = ipp->mode;
pp->seq = ipp->seq;
pp->key = ipp->key;
}
static void
cvt_perm2iperm(pp, ipp)
struct ipc_perm *pp;
struct ibcs2_ipc_perm *ipp;
{
ipp->uid = pp->uid;
ipp->gid = pp->gid;
ipp->cuid = pp->cuid;
ipp->cgid = pp->cgid;
ipp->mode = pp->mode;
ipp->seq = pp->seq;
ipp->key = pp->key;
}
static void
cvt_semid2isemid(bp, ibp)
struct semid_ds *bp;
struct ibcs2_semid_ds *ibp;
{
ibp->sem_perm = bp->sem_perm;
cvt_perm2iperm(&bp->sem_perm, &ibp->sem_perm);
ibp->sem_base = (struct ibcs2_sem *)bp->sem_base;
ibp->sem_nsems = bp->sem_nsems;
ibp->sem_otime = bp->sem_otime;
@ -194,7 +224,7 @@ cvt_isemid2semid(ibp, bp)
struct ibcs2_semid_ds *ibp;
struct semid_ds *bp;
{
bp->sem_perm = ibp->sem_perm;
cvt_iperm2perm(&ibp->sem_perm, &bp->sem_perm);
bp->sem_base = (struct sem *)ibp->sem_base;
bp->sem_nsems = ibp->sem_nsems;
bp->sem_otime = ibp->sem_otime;
@ -216,18 +246,22 @@ ibcs2_semsys(p, uap)
{
struct ibcs2_semid_ds *isp;
struct semid_ds *sp;
union semun *sup, ssu;
caddr_t sg = stackgap_init();
isp = (struct ibcs2_semid_ds *)SCARG(uap, a5);
ssu = (union semun) SCARG(uap, a5);
sp = stackgap_alloc(&sg, sizeof(struct semid_ds));
SCARG(uap, a5) = (int)sp;
sup = stackgap_alloc(&sg, sizeof(union semun));
sup->buf = sp;
SCARG(uap, a5) = (int)sup;
error = semsys(p, (struct semsys_args *)uap);
if (!error) {
SCARG(uap, a5) = (int)isp;
SCARG(uap, a5) = (int)ssu.buf;
isp = stackgap_alloc(&sg, sizeof(*isp));
cvt_semid2isemid(sp, isp);
error = copyout((caddr_t)isp,
(caddr_t)SCARG(uap, a5),
(caddr_t)ssu.buf,
sizeof(*isp));
}
return error;
@ -281,7 +315,7 @@ cvt_shmid2ishmid(bp, ibp)
struct shmid_ds *bp;
struct ibcs2_shmid_ds *ibp;
{
ibp->shm_perm = bp->shm_perm;
cvt_perm2iperm(&bp->shm_perm, &ibp->shm_perm);
ibp->shm_segsz = bp->shm_segsz;
ibp->shm_lpid = bp->shm_lpid;
ibp->shm_cpid = bp->shm_cpid;
@ -298,7 +332,7 @@ cvt_ishmid2shmid(ibp, bp)
struct ibcs2_shmid_ds *ibp;
struct shmid_ds *bp;
{
bp->shm_perm = ibp->shm_perm;
cvt_iperm2perm(&ibp->shm_perm, &bp->shm_perm);
bp->shm_segsz = ibp->shm_segsz;
bp->shm_lpid = ibp->shm_lpid;
bp->shm_cpid = ibp->shm_cpid;

View File

@ -27,7 +27,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id$
* $Id: ibcs2_ipc.h,v 1.3 1997/02/22 09:33:20 peter Exp $
*/
@ -49,7 +49,6 @@ struct ibcs2_semid_ds {
struct ipc_perm sem_perm;
struct ibcs2_sem *sem_base;
u_short sem_nsems;
int pad1;
ibcs2_time_t sem_otime;
ibcs2_time_t sem_ctime;
};