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/accept_fd_leak/accept_fd_leak.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/accept_fd_leak/accept_fd_leak.c')
-rw-r--r-- | tools/regression/sockets/accept_fd_leak/accept_fd_leak.c | 52 |
1 files changed, 35 insertions, 17 deletions
diff --git a/tools/regression/sockets/accept_fd_leak/accept_fd_leak.c b/tools/regression/sockets/accept_fd_leak/accept_fd_leak.c index 32d4edf..659c22d 100644 --- a/tools/regression/sockets/accept_fd_leak/accept_fd_leak.c +++ b/tools/regression/sockets/accept_fd_leak/accept_fd_leak.c @@ -26,7 +26,7 @@ * $FreeBSD$ */ -#include <sys/types.h> +#include <sys/param.h> #include <sys/socket.h> #include <sys/wait.h> @@ -41,13 +41,16 @@ #include <string.h> #include <unistd.h> +#define BIND_ATTEMPTS 10 #define LOOPS 500 +#define NUM_ATTEMPTS 1000 -volatile int quit; +static volatile int quit; static void -child_died(int sig) +child_died(int sig __unused) { + quit = 1; } @@ -59,13 +62,12 @@ child_died(int sig) * briefly before beginning (not 100% reliable, but a good start). */ int -main(int argc, char *argv[]) +main(void) { struct sockaddr_in sin; socklen_t size; pid_t child; - int fd1, fd2, fd3, i, s; - int status; + int fd1, fd2, fd3, i, listen_port, s, status; printf("1..2\n"); @@ -85,10 +87,22 @@ main(int argc, char *argv[]) sin.sin_len = sizeof(sin); sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - sin.sin_port = htons(8080); - if (bind(s, (struct sockaddr *) &sin, sizeof(sin)) != 0) - errx(-1, "bind: %s", strerror(errno)); + srandomdev(); + + for (i = 0; i < BIND_ATTEMPTS; i++) { + /* Pick a random unprivileged port 1025-65535 */ + listen_port = MAX((int)random() % 65535, 1025); + sin.sin_port = htons(listen_port); + if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) == 0) + break; + warn("bind with %d failed", listen_port); + usleep(1000); + } + if (i >= BIND_ATTEMPTS) { + printf("Bail out!\n"); + exit(1); + } if (listen(s, -1) != 0) errx(-1, "listen: %s", strerror(errno)); @@ -134,16 +148,20 @@ main(int argc, char *argv[]) errx(-1, "fork: %s", strerror(errno)); /* - * Child process does 1000 connect's. + * Child process does `NUM_ATTEMPTS` connects. */ if (child == 0) { + close(fd1); + close(fd2); + close(s); + bzero(&sin, sizeof(sin)); sin.sin_len = sizeof(sin); sin.sin_family = AF_INET; sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - sin.sin_port = htons(8080); + sin.sin_port = htons(listen_port); - for (i = 0; i < 1000; i++) { + for (i = 0; i < NUM_ATTEMPTS; i++) { s = socket(PF_INET, SOCK_STREAM, 0); if (s == -1) errx(-1, "socket: %s", strerror(errno)); @@ -152,7 +170,7 @@ main(int argc, char *argv[]) errx(-1, "connect: %s", strerror(errno)); close(s); } - exit(0); + _exit(0); } /* Reset back to a blocking socket. */ @@ -167,9 +185,9 @@ main(int argc, char *argv[]) errx(-1, "ioctl(F_GETFL): %s", strerror(errno)); if (i & O_NONBLOCK) errx(-1, "Failed to clear O_NONBLOCK (i=0x%x)\n", i); - - /* Do 1000 accept's with an invalid pointer. */ - for (i = 0; !quit && i < 1000; i++) { + + /* Do `NUM_ATTEMPTS` accepts with an invalid pointer. */ + for (i = 0; !quit && i < NUM_ATTEMPTS; i++) { size = sizeof(sin); if (accept(s, (struct sockaddr *)(uintptr_t)(0x100), &size) != -1) @@ -182,7 +200,7 @@ main(int argc, char *argv[]) errx(-1, "waitpid: %s", strerror(errno)); if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) warnx("child process died"); - + /* * Allocate a file descriptor and make sure it's fd2+2. 2 because * we allocate an fd for the socket. |