diff options
author | Artur Grabowski <art@cvs.openbsd.org> | 2002-02-11 04:57:56 +0000 |
---|---|---|
committer | Artur Grabowski <art@cvs.openbsd.org> | 2002-02-11 04:57:56 +0000 |
commit | e497b6477b36f5e48e54fba8622410b2d1b199e5 (patch) | |
tree | 096e243ce08225c0f5ed9059d2eecc815ec7e60b | |
parent | 1d6b3d915a0890c607f8ae68eea4ae785d289f92 (diff) |
Make this 64-bit safe.
-rw-r--r-- | regress/sys/kern/unfdpass/unfdpass.c | 44 |
1 files changed, 21 insertions, 23 deletions
diff --git a/regress/sys/kern/unfdpass/unfdpass.c b/regress/sys/kern/unfdpass/unfdpass.c index 3d83decc912..0eb25b28c1c 100644 --- a/regress/sys/kern/unfdpass/unfdpass.c +++ b/regress/sys/kern/unfdpass/unfdpass.c @@ -1,4 +1,4 @@ -/* $OpenBSD: unfdpass.c,v 1.4 2002/02/09 13:56:29 art Exp $ */ +/* $OpenBSD: unfdpass.c,v 1.5 2002/02/11 04:57:55 art Exp $ */ /* $NetBSD: unfdpass.c,v 1.3 1998/06/24 23:51:30 thorpej Exp $ */ /*- @@ -52,6 +52,7 @@ #include <fcntl.h> #include <signal.h> #include <stdio.h> +#include <stdlib.h> #include <string.h> #include <unistd.h> @@ -61,16 +62,6 @@ int main __P((int, char *[])); void child __P((void)); void catch_sigchld __P((int)); -struct fdcmessage { - struct cmsghdr cm; - int files[2]; -}; - -struct crcmessage { - struct cmsghdr cm; - char creds[SOCKCREDSIZE(NGROUPS)]; -}; - /* ARGSUSED */ int main(argc, argv) @@ -81,16 +72,18 @@ main(argc, argv) int listensock, sock, fd, i, status; char fname[16], buf[64]; struct cmsghdr *cmp; - struct { - struct fdcmessage fdcm; - struct crcmessage crcm; - } message; int *files = NULL; struct sockcred *sc = NULL; struct sockaddr_un sun, csun; int csunlen; fd_set oob; pid_t pid; + void *message; + int msglen; + + msglen = CMSG_LEN(MAX(sizeof(int) * 2, SOCKCREDSIZE(NGROUPS))); + if ((message = malloc(msglen)) == NULL) + err(1, "malloc"); /* * Create the test files. @@ -161,8 +154,8 @@ main(argc, argv) * Grab the descriptors and credentials passed to us. */ (void) memset(&msg, 0, sizeof(msg)); - msg.msg_control = (caddr_t) &message; - msg.msg_controllen = sizeof(message); + msg.msg_control = (caddr_t) message; + msg.msg_controllen = msglen; if (recvmsg(sock, &msg, 0) < 0) err(1, "recvmsg"); @@ -184,7 +177,7 @@ main(argc, argv) switch (cmp->cmsg_type) { case SCM_RIGHTS: - if (cmp->cmsg_len != sizeof(message.fdcm)) + if (cmp->cmsg_len != CMSG_LEN(sizeof(int) * 2)) errx(1, "bad fd control message length %d", cmp->cmsg_len); @@ -256,9 +249,14 @@ child() struct msghdr msg; char fname[16], buf[64]; struct cmsghdr *cmp; - struct fdcmessage fdcm; int i, fd, sock; struct sockaddr_un sun; + struct cmsghdr *cmpf; + int *files; + + if ((cmpf = malloc(CMSG_LEN(sizeof(int) * 2))) == NULL) + err(1, "malloc"); + files = (int *)CMSG_DATA(cmpf); /* * Create socket and connect to the receiver. @@ -281,15 +279,15 @@ child() (void) sprintf(fname, "file%d", i + 1); if ((fd = open(fname, O_RDONLY, 0666)) == -1) err(1, "child open %s", fname); - fdcm.files[i] = fd; + files[i] = fd; } (void) memset(&msg, 0, sizeof(msg)); - msg.msg_control = (caddr_t) &fdcm; - msg.msg_controllen = sizeof(fdcm); + msg.msg_control = (caddr_t)cmpf; + msg.msg_controllen = CMSG_LEN(sizeof(int) * 2); cmp = CMSG_FIRSTHDR(&msg); - cmp->cmsg_len = sizeof(fdcm); + cmp->cmsg_len = CMSG_LEN(sizeof(int) * 2); cmp->cmsg_level = SOL_SOCKET; cmp->cmsg_type = SCM_RIGHTS; |