diff options
author | ngie <ngie@FreeBSD.org> | 2015-04-25 05:31:52 +0000 |
---|---|---|
committer | ngie <ngie@FreeBSD.org> | 2015-04-25 05:31:52 +0000 |
commit | 613943f9f120ccf49b2c7002eaa09327a281f367 (patch) | |
tree | 54e284e7948f0a2e0c71ebdebb00f28185894621 /tools/regression/sockets/unix_passfd/unix_passfd.c | |
parent | 70eb2d81410b8dedf542c6b3ef6793bed481c88e (diff) | |
download | FreeBSD-src-613943f9f120ccf49b2c7002eaa09327a281f367.zip FreeBSD-src-613943f9f120ccf49b2c7002eaa09327a281f367.tar.gz |
MFC r261550,r281354,r281355,r281356,r281358,r281359,r281360,r281361,r281362,r281391,r281392,r281393,r281394,r281395,r281397,r281398,r281399,r281400,r281401,r281402,r281403,r281404,r281407,r281408,r281409,r281410,r281411:
r261550 (by glebius):
Add test case for kern/181741. Right now test fails.
PR: 181741
Sponsored by: Nginx, Inc.
r281354:
Fix warnings, fix a typo in a testcase description, bump WARNS to 3
- Remove argc/argv (-Wunused)
- Cast len in comparison to size_t (-Wsign-compare)
Sponsored by: EMC / Isilon Storage Division
r281355:
Fix -Wunused warnings, bump WARNS to 6
The testcase fails today on subtest # 9
The output is still broken if prove -rv is run and the testcase aborts
prematurely (the testcase doesn't really conform to TAP protocol properly,
except when it completes fully)
Sponsored by: EMC / Isilon Storage Division
r281356:
Fix -Wunused warnings, bump WARNS to 6
The output is still broken if prove -rv is run and the testcase aborts
prematurely with fail_assertion (the testcase doesn't really conform to TAP
protocol properly, except when it completes fully)
Sponsored by: EMC / Isilon Storage Division
r281358:
- Parameterize out the number of accept/connect attempts
- Randomize the bind port to allow 2+ consecutive calls in < 10 minutes, and
to also not fail if (for instance) there's a server already listening on port
8080
- Don't leak the listening socket / fds into the child process
- Fix warnings:
-- Remove argc/argv (-Wunused)
-- Mark sig __unused (-Wunused)
-- Mark quit static (-Wmissing-variable-declarations)
Sponsored by: EMC / Isilon Storage Division
r281359:
Remove argc/argv (-Wunused)
Sponsored by: EMC / Isilon Storage Division
r281360:
Fix warnings
- Remove argc/argv (-Wunused)
- Mark some parameters to socket_listen_update __unused (-Wunused)
Sponsored by: EMC / Isilon Storage Division
r281361:
Remove argc/argv (-Wunused)
Sponsored by: EMC / Isilon Storage Division
r281362:
Use _exit, not exit in forked process
Sponsored by: EMC / Isilon Storage Division
r281391:
- Use static buffers for temporary file paths instead of strdup of constant strings
- Don't use /tmp because it's outside ATF's prescribed sandbox
- Use mkstemp instead of mktemp to eliminate warning
Sponsored by: EMC / Isilon Storage Division
r281392:
- Garbage collect argc/argv (-Wunused)
- Bump WARNS to 6
Sponsored by: EMC / Isilon Storage Division
r281393:
Fix warnings and bump WARNS to 6
- Garbage collect argc/argv (-Wunused)
- sleep(3) will always return an unsigned int; don't check for return codes <0
(-Wsign-compare)
Sponsored by: EMC / Isilon Storage Division
r281394:
- Don't use /tmp because it's outside ATF's prescribed sandbox
- Replace a hardcoded PATH_MAX value with sizeof(path)
- Use path like an array, not a pointer, and always try to unlink it in cleanup
Sponsored by: EMC / Isilon Storage Division
r281395:
Fix a -Wuninitialized warning by setting the socket to -1 and bump WARNS to 6
Sponsored by: EMC / Isilon Storage Division
r281397:
Mark signum unused in signal_handler; bump WARNS to 6
Sponsored by: EMC / Isilon Storage Division
r281398:
Garbage collect argc/argv and bump WARNS to 6
Sponsored by: EMC / Isilon Storage Division
r281399:
Fix warnings and bump WARNS to 6
- Staticize variables as needed
- Garbage collect argc/argv
- Fix -Wsign-compare warnings by casting small sizeof to (int)
Sponsored by: EMC / Isilon Storage Division
r281400:
- Garbage collect argc/argv; bump WARNS to 6
- Make the socket path random and move it out of /tmp as that's outside ATF's
prescribed path
Sponsored by: EMC / Isilon Storage Division
r281401:
- Garbage collect argc/argv
- Use random paths instead of one in /tmp
Sponsored by: EMC / Isilon Storage Division
r281402:
Garbage collect argc/argv and bump WARNS to 6
Sponsored by: EMC / Isilon Storage Division
r281403:
Garbage collect argc/argv and bump WARNS to 6
Sponsored by: EMC / Isilon Storage Division
r281404:
Generate temporary files with mkstemp instead of mktemp
Sponsored by: EMC / Isilon Storage Division
r281407:
Fix the knob twiddling to work properly per src.opts.mk
Sponsored by: EMC / Isilon Storage Division
r281408:
- Remove the .t wrapper and put the "magic" of determining the number of
testcases into the .c file
- Require root for now because it fails with SOCK_RAW without root privileges
- Increment the test count properly on socket create failure
Sponsored by: EMC / Isilon Storage Division
r281409:
Fix warnings, bump WARNS to 6, and use a temporary socket instead of one in /tmp
Sponsored by: EMC / Isilon Storage Division
r281410:
Fix more warnings I didn't catch in the first go-around
Sponsored by: EMC / Isilon Storage Division
r281411:
Fix even more warnings..
Sponsored by: EMC / Isilon Storage Division
Diffstat (limited to 'tools/regression/sockets/unix_passfd/unix_passfd.c')
-rw-r--r-- | tools/regression/sockets/unix_passfd/unix_passfd.c | 106 |
1 files changed, 80 insertions, 26 deletions
diff --git a/tools/regression/sockets/unix_passfd/unix_passfd.c b/tools/regression/sockets/unix_passfd/unix_passfd.c index 327a58f..07ef589 100644 --- a/tools/regression/sockets/unix_passfd/unix_passfd.c +++ b/tools/regression/sockets/unix_passfd/unix_passfd.c @@ -29,11 +29,14 @@ #include <sys/types.h> #include <sys/socket.h> #include <sys/stat.h> +#include <sys/sysctl.h> +#include <sys/un.h> #include <err.h> #include <fcntl.h> #include <limits.h> #include <stdio.h> +#include <stdlib.h> #include <string.h> #include <unistd.h> @@ -106,11 +109,10 @@ samefile(const char *test, struct stat *sb1, struct stat *sb2) } static void -sendfd(const char *test, int sockfd, int sendfd) +sendfd_payload(const char *test, int sockfd, int sendfd, + void *payload, size_t paylen) { struct iovec iovec; - char ch; - char message[CMSG_SPACE(sizeof(int))]; struct cmsghdr *cmsghdr; struct msghdr msghdr; @@ -118,13 +120,12 @@ sendfd(const char *test, int sockfd, int sendfd) bzero(&msghdr, sizeof(msghdr)); bzero(&message, sizeof(message)); - ch = 0; msghdr.msg_control = message; msghdr.msg_controllen = sizeof(message); - iovec.iov_base = &ch; - iovec.iov_len = sizeof(ch); + iovec.iov_base = payload; + iovec.iov_len = paylen; msghdr.msg_iov = &iovec; msghdr.msg_iovlen = 1; @@ -138,33 +139,35 @@ sendfd(const char *test, int sockfd, int sendfd) len = sendmsg(sockfd, &msghdr, 0); if (len < 0) err(-1, "%s: sendmsg", test); - if (len != sizeof(ch)) + if ((size_t)len != paylen) errx(-1, "%s: sendmsg: %zd bytes sent", test, len); } static void -recvfd(const char *test, int sockfd, int *recvfd) +sendfd(const char *test, int sockfd, int sendfd) +{ + char ch; + + return (sendfd_payload(test, sockfd, sendfd, &ch, sizeof(ch))); +} + +static void +recvfd_payload(const char *test, int sockfd, int *recvfd, + void *buf, size_t buflen) { struct cmsghdr *cmsghdr; - char message[CMSG_SPACE(sizeof(int))]; + char message[CMSG_SPACE(SOCKCREDSIZE(CMGROUP_MAX)) + sizeof(int)]; struct msghdr msghdr; struct iovec iovec; ssize_t len; - char ch; bzero(&msghdr, sizeof(msghdr)); - ch = 0; msghdr.msg_control = message; msghdr.msg_controllen = sizeof(message); - iovec.iov_base = &ch; - iovec.iov_len = sizeof(ch); - - msghdr.msg_iov = &iovec; - msghdr.msg_iovlen = 1; - - iovec.iov_len = sizeof(ch); + iovec.iov_base = buf; + iovec.iov_len = buflen; msghdr.msg_iov = &iovec; msghdr.msg_iovlen = 1; @@ -172,23 +175,37 @@ recvfd(const char *test, int sockfd, int *recvfd) len = recvmsg(sockfd, &msghdr, 0); if (len < 0) err(-1, "%s: recvmsg", test); - if (len != sizeof(ch)) + if ((size_t)len != buflen) errx(-1, "%s: recvmsg: %zd bytes received", test, len); + cmsghdr = CMSG_FIRSTHDR(&msghdr); if (cmsghdr == NULL) errx(-1, "%s: recvmsg: did not receive control message", test); - if (cmsghdr->cmsg_len != CMSG_LEN(sizeof(int)) || - cmsghdr->cmsg_level != SOL_SOCKET || - cmsghdr->cmsg_type != SCM_RIGHTS) + *recvfd = -1; + for (; cmsghdr != NULL; cmsghdr = CMSG_NXTHDR(&msghdr, cmsghdr)) { + if (cmsghdr->cmsg_level == SOL_SOCKET && + cmsghdr->cmsg_type == SCM_RIGHTS && + cmsghdr->cmsg_len == CMSG_LEN(sizeof(int))) { + *recvfd = *(int *)CMSG_DATA(cmsghdr); + if (*recvfd == -1) + errx(-1, "%s: recvmsg: received fd -1", test); + } + } + if (*recvfd == -1) errx(-1, "%s: recvmsg: did not receive single-fd message", test); - *recvfd = *(int *)CMSG_DATA(cmsghdr); - if (*recvfd == -1) - errx(-1, "%s: recvmsg: received fd -1", test); +} + +static void +recvfd(const char *test, int sockfd, int *recvfd) +{ + char ch; + + return (recvfd_payload(test, sockfd, recvfd, &ch, sizeof(ch))); } int -main(int argc, char *argv[]) +main(void) { struct stat putfd_1_stat, putfd_2_stat, getfd_1_stat, getfd_2_stat; int fd[2], putfd_1, putfd_2, getfd_1, getfd_2; @@ -330,6 +347,43 @@ main(int argc, char *argv[]) closesocketpair(fd); printf("%s passed\n", test); + + /* + * Test for PR 181741. Receiver sets LOCAL_CREDS, and kernel + * prepends a control message to the data. Sender sends large + * payload. Payload + SCM_RIGHTS + LOCAL_CREDS hit socket buffer + * limit, and receiver receives truncated data. + */ + test = "test8-rights+creds+payload"; + printf("beginning %s\n", test); + + { + const int on = 1; + u_long sendspace; + size_t len; + void *buf; + + len = sizeof(sendspace); + if (sysctlbyname("net.local.stream.sendspace", &sendspace, + &len, NULL, 0) < 0) + err(-1, "%s: sysctlbyname(net.local.stream.sendspace)", + test); + + if ((buf = malloc(sendspace)) == NULL) + err(-1, "%s: malloc", test); + + domainsocketpair(test, fd); + if (setsockopt(fd[1], 0, LOCAL_CREDS, &on, sizeof(on)) < 0) + err(-1, "%s: setsockopt(LOCAL_CREDS)", test); + tempfile(test, &putfd_1); + sendfd_payload(test, fd[0], putfd_1, buf, sendspace); + recvfd_payload(test, fd[1], &getfd_1, buf, sendspace); + close(putfd_1); + close(getfd_1); + closesocketpair(fd); + } + + printf("%s passed\n", test); return (0); } |