From 3fdcdd47c6a67585123a0a0c8fffabcc9f79a3a2 Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Tue, 12 Jan 2016 14:47:12 +0000 Subject: [PATCH] scm_rights-fd.test: rewrite without fork * 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. --- Signed-off-by: Khem Raj Upstream-Status: Backport tests/scm_rights-fd.test | 12 ++--- tests/scm_rights.c | 122 ++++++++++++++++++++++------------------------- 2 files changed, 63 insertions(+), 71 deletions(-) diff --git a/tests/scm_rights-fd.test b/tests/scm_rights-fd.test index a32ef36..48c5028 100755 --- a/tests/scm_rights-fd.test +++ b/tests/scm_rights-fd.test @@ -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, 4, 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, 5, 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, $msg, \\[$rights\\], msg_flags=0\\}, 0\\) += $n -${prefix}recvmsg\\(0, $msg, \\[$creds, $rights\\], msg_flags=0\\}, 0\\) += $n +sendmsg\\(3, $msg, \\[$rights\\], msg_flags=0\\}, 0\\) = 15 +recvmsg\\(0, $msg, \\[$creds, $rights\\], msg_flags=0\\}, 0\\) = 15 __EOF__ match_grep "$LOG" "$EXPECTED" diff --git a/tests/scm_rights.c b/tests/scm_rights.c index 1e5e850..00af4d5 100644 --- a/tests/scm_rights.c +++ b/tests/scm_rights.c @@ -27,26 +27,39 @@ #include "tests.h" #include -#include -#include -#include #include #include +#include +#include +#include #include -#include 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; } -- 1.9.1