]> granicus.if.org Git - strace/commitdiff
scm_rights-fd.test: rewrite without fork
authorDmitry V. Levin <ldv@altlinux.org>
Tue, 12 Jan 2016 14:47:12 +0000 (14:47 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Tue, 12 Jan 2016 16:06:58 +0000 (16:06 +0000)
* tests/scm_rights.c (main): Rewrite without fork.
Place all objects passed to sendmsg and recvmsg at the end
of memory pages followed by inaccessible pages.
* tests/scm_rights-fd.test: Update.

tests/scm_rights-fd.test
tests/scm_rights.c

index a32ef366d897fd24692137b89d5566a3b094458b..48c5028b62c5058605e5ac96e680c64e688304ed 100755 (executable)
@@ -49,18 +49,18 @@ touch -- "$file" ||
        framework_skip_ 'failed to create a file'
 
 run_prog ./scm_rights /dev/zero
-run_strace_merge -y -x -enetwork $args "$file"
+run_strace -y -x -enetwork $args "$file"
 
+sample='\\xf1\\xf2\\xf3\\xf4\\xf5\\xf6\\xf7\\xf8\\xf9\\xfa\\xfb\\xfc\\xfd\\xfe\\xff'
 n='[1-9][0-9]*'
-msg='\{msg_name\(0\)=NULL, msg_iov\(1\)=\[\{"\\x00\\x00\\x00\\x00[^"]*", '"$n"'\}\], msg_controllen='"$n"
-rights='\{cmsg_len='"$n"', cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, \[3</dev/null>, 4</dev/zero>, 5</[^}>]*/(A\\n){127}Z>\]\}'
+msg='\{msg_name\(0\)=NULL, msg_iov\(1\)=\[\{"'"$sample"'", 15\}\], msg_controllen='"$n"
+rights='\{cmsg_len='"$n"', cmsg_level=SOL_SOCKET, cmsg_type=SCM_RIGHTS, \[4</dev/null>, 5</dev/zero>, 6</[^}>]*/(A\\n){127}Z>\]\}'
 creds='\{cmsg_len='"$n"', cmsg_level=SOL_SOCKET, cmsg_type=SCM_CREDENTIALS, \{pid='"$n"', uid=[0-9]+, gid=[0-9]+\}\}'
-prefix='[1-9][0-9]* +[0-9]+:[0-9]+:[0-9]+\.[0-9]+ +'
 EXPECTED="$LOG.expected"
 
 cat > "$EXPECTED" << __EOF__
-${prefix}sendmsg\\(1<socket:\\[[0-9]+\\]>, $msg, \\[$rights\\], msg_flags=0\\}, 0\\) += $n
-${prefix}recvmsg\\(0<socket:\\[[0-9]+\\]>, $msg, \\[$creds, $rights\\], msg_flags=0\\}, 0\\) += $n
+sendmsg\\(3<socket:\\[[0-9]+\\]>, $msg, \\[$rights\\], msg_flags=0\\}, 0\\) = 15
+recvmsg\\(0<socket:\\[[0-9]+\\]>, $msg, \\[$creds, $rights\\], msg_flags=0\\}, 0\\) = 15
 __EOF__
 
 match_grep "$LOG" "$EXPECTED"
index 1e5e850a5b03be7c6e57659512bd2b97658a063a..00af4d55e50ec4909d387b46be1779d37b1c7d68 100644 (file)
 
 #include "tests.h"
 #include <assert.h>
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
 #include <errno.h>
 #include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
 #include <sys/socket.h>
-#include <sys/wait.h>
 
 int main(int ac, const char **av)
 {
-       int i;
-       int data = 0;
-       struct iovec iov = {
-               .iov_base = &data,
-               .iov_len = sizeof(iov)
-       };
+       assert(ac > 0);
+       int fds[ac];
+
+       static const char sample[] =
+               "\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff";
+       const unsigned int data_size = sizeof(sample) - 1;
+       void *data = tail_alloc(data_size);
+       memcpy(data, sample, data_size);
+
+       struct iovec *iov = tail_alloc(sizeof(struct iovec));
+       iov->iov_base = data;
+       iov->iov_len = data_size;
 
-       while ((i = open("/dev/null", O_RDWR)) < 3)
+       struct msghdr *mh = tail_alloc(sizeof(struct msghdr));
+       memset(mh, 0, sizeof(*mh));
+       mh->msg_iov = iov;
+       mh->msg_iovlen = 1;
+
+       int i;
+       while ((i = open("/dev/null", O_RDWR)) <= ac + 2)
                assert(i >= 0);
-       (void) close(3);
+       while (i > 2)
+               assert(close(i--) == 0);
+       assert(close(0) == 0);
 
        int sv[2];
        if (socketpair(AF_UNIX, SOCK_STREAM, 0, sv))
@@ -55,60 +68,39 @@ int main(int ac, const char **av)
        if (setsockopt(sv[0], SOL_SOCKET, SO_PASSCRED, &one, sizeof(one)))
                perror_msg_and_skip("setsockopt");
 
-       pid_t pid = fork();
-       if (pid < 0)
-               perror_msg_and_fail("fork");
-
-       if (pid) {
-               assert(close(sv[0]) == 0);
-               assert(dup2(sv[1], 1) == 1);
-               assert(close(sv[1]) == 0);
-
-               int fds[ac];
-               assert((fds[0] = open("/dev/null", O_RDWR)) == 3);
-               for (i = 1; i < ac; ++i)
-                       assert((fds[i] = open(av[i], O_RDONLY)) == i + 3);
-
-               union {
-                       struct cmsghdr cmsg;
-                       char buf[CMSG_LEN(sizeof(fds))];
-               } control;
-
-               control.cmsg.cmsg_level = SOL_SOCKET;
-               control.cmsg.cmsg_type = SCM_RIGHTS;
-               control.cmsg.cmsg_len = CMSG_LEN(sizeof(fds));
-               memcpy(CMSG_DATA(&control.cmsg), fds, sizeof(fds));
-
-               struct msghdr mh = {
-                       .msg_iov = &iov,
-                       .msg_iovlen = 1,
-                       .msg_control = &control,
-                       .msg_controllen = sizeof(control)
-               };
-
-               assert(sendmsg(1, &mh, 0) == sizeof(iov));
-               assert(close(1) == 0);
-
-                int status;
-               assert(waitpid(pid, &status, 0) == pid);
-               assert(status == 0);
-       } else {
-               assert(close(sv[1]) == 0);
-               assert(dup2(sv[0], 0) == 0);
-               assert(close(sv[0]) == 0);
-
-               struct cmsghdr control[4 + ac * sizeof(int) / sizeof(struct cmsghdr)];
-
-               struct msghdr mh = {
-                       .msg_iov = &iov,
-                       .msg_iovlen = 1,
-                       .msg_control = control,
-                       .msg_controllen = sizeof(control)
-               };
-
-               assert(recvmsg(0, &mh, 0) == sizeof(iov));
-               assert(close(0) == 0);
+       assert((fds[0] = open("/dev/null", O_RDWR)) == 4);
+       for (i = 1; i < ac; ++i)
+               assert((fds[i] = open(av[i], O_RDONLY)) == i + 4);
+
+       unsigned int cmsg_size = CMSG_SPACE(sizeof(fds));
+       struct cmsghdr *cmsg = tail_alloc(cmsg_size);
+       memset(cmsg, 0, cmsg_size);
+       cmsg->cmsg_level = SOL_SOCKET;
+       cmsg->cmsg_type = SCM_RIGHTS;
+       cmsg->cmsg_len = CMSG_LEN(sizeof(fds));
+       memcpy(CMSG_DATA(cmsg), fds, sizeof(fds));
+
+       mh->msg_control = cmsg;
+       mh->msg_controllen = cmsg_size;
+
+       assert(sendmsg(sv[1], mh, 0) == (int) data_size);
+
+       assert(close(sv[1]) == 0);
+       assert(open("/dev/null", O_RDWR) == sv[1]);
+
+       for (i = 0; i < ac; ++i) {
+               assert(close(fds[i]) == 0);
+               fds[i] = 0;
        }
 
+       cmsg_size += CMSG_SPACE(sizeof(struct ucred));
+       cmsg = tail_alloc(cmsg_size);
+       memset(cmsg, 0, cmsg_size);
+       mh->msg_control = cmsg;
+       mh->msg_controllen = cmsg_size;
+
+       assert(recvmsg(0, mh, 0) == (int) data_size);
+       assert(close(0) == 0);
+
        return 0;
 }