Index: user/ngie/more-tests/tests/sys/socket/unix_sendtorace_test.c =================================================================== --- user/ngie/more-tests/tests/sys/socket/unix_sendtorace_test.c (revision 281577) +++ user/ngie/more-tests/tests/sys/socket/unix_sendtorace_test.c (nonexistent) @@ -1,215 +0,0 @@ -/*- - * Copyright (c) 2006 Robert N. M. Watson - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -/* - * Attempts to exercise UNIX domain socket races relating to the non-atomic - * connect-and-send properties of sendto(). As the result of such a race is - * a kernel panic, this test simply completes or doesn't. - * - * XXX: Despite implementing support for sendto() on stream sockets with - * implied connect, the appropriate flag isn't set in the FreeBSD kernel so - * it does not work. For now, don't call the stream test. - */ - -#include -#include -#include - -#include -#include -#include -#include - -#define ITERATIONS 1000000 - -static char socket_path[] = "tmp.XXXXXX"; - -static void -stream_server(int listenfd) -{ - int acceptfd; - - while (1) { - acceptfd = accept(listenfd, NULL, NULL); - if (acceptfd < 0) { - warn("stream_server: accept"); - continue; - } - sleep(1); - close(acceptfd); - } -} - -static void -stream_client(void) -{ - struct sockaddr_un sun; - ssize_t len; - char c = 0; - int fd, i; - - bzero(&sun, sizeof(sun)); - sun.sun_len = sizeof(sun); - sun.sun_family = AF_UNIX; - strcpy(sun.sun_path, socket_path); - for (i = 0; i < ITERATIONS; i++) { - fd = socket(PF_UNIX, SOCK_STREAM, 0); - if (fd < 0) { - warn("stream_client: socket"); - return; - } - len = sendto(fd, &c, sizeof(c), 0, (struct sockaddr *)&sun, - sizeof(sun)); - if (len < 0) - warn("stream_client: sendto"); - close(fd); - } -} - -static void -stream_test(void) -{ - struct sockaddr_un sun; - pid_t childpid; - int listenfd; - - listenfd = socket(PF_UNIX, SOCK_STREAM, 0); - if (listenfd < 0) - err(-1, "stream_test: socket"); - - bzero(&sun, sizeof(sun)); - sun.sun_len = sizeof(sun); - sun.sun_family = AF_UNIX; - strcpy(sun.sun_path, socket_path); - - if (bind(listenfd, (struct sockaddr *)&sun, sizeof(sun)) < 0) - err(-1, "stream_test: bind"); - - if (listen(listenfd, -1) < 0) - err(-1, "stream_test: listen"); - - childpid = fork(); - if (childpid < 0) - err(-1, "stream_test: fork"); - - if (childpid != 0) { - sleep(1); - stream_client(); - kill(childpid, SIGTERM); - sleep(1); - } else - stream_server(listenfd); - - (void)unlink(socket_path); -} - -static void -datagram_server(int serverfd) -{ - ssize_t len; - char c; - - while (1) { - len = recv(serverfd, &c, sizeof(c), 0); - if (len < 0) - warn("datagram_server: recv"); - } -} - -static void -datagram_client(void) -{ - struct sockaddr_un sun; - ssize_t len; - char c = 0; - int fd, i; - - bzero(&sun, sizeof(sun)); - sun.sun_len = sizeof(sun); - sun.sun_family = AF_UNIX; - strcpy(sun.sun_path, socket_path); - for (i = 0; i < ITERATIONS; i++) { - fd = socket(PF_UNIX, SOCK_DGRAM, 0); - if (fd < 0) { - warn("datagram_client: socket"); - return; - } - len = sendto(fd, &c, sizeof(c), 0, (struct sockaddr *)&sun, - sizeof(sun)); - if (len < 0) - warn("datagram_client: sendto"); - close(fd); - } -} - -static void -datagram_test(void) -{ - struct sockaddr_un sun; - pid_t childpid; - int serverfd; - - serverfd = socket(PF_UNIX, SOCK_DGRAM, 0); - if (serverfd < 0) - err(-1, "datagram_test: socket"); - - bzero(&sun, sizeof(sun)); - sun.sun_len = sizeof(sun); - sun.sun_family = AF_UNIX; - strcpy(sun.sun_path, socket_path); - - if (bind(serverfd, (struct sockaddr *)&sun, sizeof(sun)) < 0) - err(-1, "datagram_test: bind"); - - childpid = fork(); - if (childpid < 0) - err(-1, "datagram_test: fork"); - - if (childpid != 0) { - sleep(1); - datagram_client(); - kill(childpid, SIGTERM); - sleep(1); - } else - datagram_server(serverfd); - - (void)unlink(socket_path); -} - -int -main(void) -{ - - if (mkstemp(socket_path) == -1) - err(1, "mkstemp failed"); - (void)unlink(socket_path); - datagram_test(); - if (0) - stream_test(); - return (0); -} Property changes on: user/ngie/more-tests/tests/sys/socket/unix_sendtorace_test.c ___________________________________________________________________ Deleted: svn:keywords ## -1 +0,0 ## -FreeBSD=%H \ No newline at end of property Index: user/ngie/more-tests/tests/sys/socket/Makefile =================================================================== --- user/ngie/more-tests/tests/sys/socket/Makefile (revision 281577) +++ user/ngie/more-tests/tests/sys/socket/Makefile (revision 281578) @@ -1,53 +1,53 @@ # $FreeBSD$ # # Some of these tests fail on 11.0-CURRENT @ r280355 with DEBUG bits on TESTSDIR= ${TESTSBASE}/sys/socket BINDIR= ${TESTSDIR} PROGS+= unix_cmsg TAP_TESTS_C+= accept_fd_leak_test # accf_data_attach: not ok 9 - setsockopt() after listen() failed with 2 (No such file or directory) ATF_TESTS_C+= accf_data_attach_test PLAIN_TESTS_C+= fstat_test PLAIN_TESTS_C+= kqueue_test PLAIN_TESTS_C+= listen_backlog_test PLAIN_TESTS_C+= listenclose_test PLAIN_TESTS_C+= pr_atomic_test PLAIN_TESTS_C+= reconnect_test # rtsocket: socket(PF_ROUTE, SOCK_STREAM, 0): Protocol wrong type for socket PLAIN_TESTS_C+= rtsocket_test PLAIN_TESTS_C+= sblock_test TAP_TESTS_C+= sendfile_test PLAIN_TESTS_C+= shutdown_test PLAIN_TESTS_C+= sigpipe_test TAP_TESTS_C+= so_setfib_test PLAIN_TESTS_C+= socketpair_test PLAIN_TESTS_C+= unix_bindconnect_test PLAIN_TESTS_C+= unix_close_race_test # Lots of failures TAP_TESTS_SH+= unix_cmsg_test # unix_gc: twosome_drop1: sendfd: before 0 after 0 PLAIN_TESTS_C+= unix_gc_test ATF_TESTS_C+= unix_passfd_test -PLAIN_TESTS_C+= unix_sendtorace_test +PLAIN_TESTS_C+= unix_sendto_race_test # unix_socket: socket(PF_LOCAL, SOCK_RAW, 0): Protocol wrong type for socket PLAIN_TESTS_C+= unix_socket_test PLAIN_TESTS_C+= unix_sorflush_test # zerosend: tcp_0write: bind(127.0.0.1, 10001): Address already in use ATF_TESTS_C+= zerosend_test DPADD.sendfile_test+= ${LIBMD} LDADD.sendfile_test+= -lmd # XXX: this doesn't work..? #WARNS.unix_cmsg= 3 #WARNS.unix_gc= 3 #WARNS.unix_passfd= 3 #WARNS.zerosend= 2 WARNS= 2 .include Index: user/ngie/more-tests/tests/sys/socket/unix_sendto_race_test.c =================================================================== --- user/ngie/more-tests/tests/sys/socket/unix_sendto_race_test.c (nonexistent) +++ user/ngie/more-tests/tests/sys/socket/unix_sendto_race_test.c (revision 281578) @@ -0,0 +1,215 @@ +/*- + * Copyright (c) 2006 Robert N. M. Watson + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +/* + * Attempts to exercise UNIX domain socket races relating to the non-atomic + * connect-and-send properties of sendto(). As the result of such a race is + * a kernel panic, this test simply completes or doesn't. + * + * XXX: Despite implementing support for sendto() on stream sockets with + * implied connect, the appropriate flag isn't set in the FreeBSD kernel so + * it does not work. For now, don't call the stream test. + */ + +#include +#include +#include + +#include +#include +#include +#include + +#define ITERATIONS 1000000 + +static char socket_path[] = "tmp.XXXXXX"; + +static void +stream_server(int listenfd) +{ + int acceptfd; + + while (1) { + acceptfd = accept(listenfd, NULL, NULL); + if (acceptfd < 0) { + warn("stream_server: accept"); + continue; + } + sleep(1); + close(acceptfd); + } +} + +static void +stream_client(void) +{ + struct sockaddr_un sun; + ssize_t len; + char c = 0; + int fd, i; + + bzero(&sun, sizeof(sun)); + sun.sun_len = sizeof(sun); + sun.sun_family = AF_UNIX; + strcpy(sun.sun_path, socket_path); + for (i = 0; i < ITERATIONS; i++) { + fd = socket(PF_UNIX, SOCK_STREAM, 0); + if (fd < 0) { + warn("stream_client: socket"); + return; + } + len = sendto(fd, &c, sizeof(c), 0, (struct sockaddr *)&sun, + sizeof(sun)); + if (len < 0) + warn("stream_client: sendto"); + close(fd); + } +} + +static void +stream_test(void) +{ + struct sockaddr_un sun; + pid_t childpid; + int listenfd; + + listenfd = socket(PF_UNIX, SOCK_STREAM, 0); + if (listenfd < 0) + err(-1, "stream_test: socket"); + + bzero(&sun, sizeof(sun)); + sun.sun_len = sizeof(sun); + sun.sun_family = AF_UNIX; + strcpy(sun.sun_path, socket_path); + + if (bind(listenfd, (struct sockaddr *)&sun, sizeof(sun)) < 0) + err(-1, "stream_test: bind"); + + if (listen(listenfd, -1) < 0) + err(-1, "stream_test: listen"); + + childpid = fork(); + if (childpid < 0) + err(-1, "stream_test: fork"); + + if (childpid != 0) { + sleep(1); + stream_client(); + kill(childpid, SIGTERM); + sleep(1); + } else + stream_server(listenfd); + + (void)unlink(socket_path); +} + +static void +datagram_server(int serverfd) +{ + ssize_t len; + char c; + + while (1) { + len = recv(serverfd, &c, sizeof(c), 0); + if (len < 0) + warn("datagram_server: recv"); + } +} + +static void +datagram_client(void) +{ + struct sockaddr_un sun; + ssize_t len; + char c = 0; + int fd, i; + + bzero(&sun, sizeof(sun)); + sun.sun_len = sizeof(sun); + sun.sun_family = AF_UNIX; + strcpy(sun.sun_path, socket_path); + for (i = 0; i < ITERATIONS; i++) { + fd = socket(PF_UNIX, SOCK_DGRAM, 0); + if (fd < 0) { + warn("datagram_client: socket"); + return; + } + len = sendto(fd, &c, sizeof(c), 0, (struct sockaddr *)&sun, + sizeof(sun)); + if (len < 0) + warn("datagram_client: sendto"); + close(fd); + } +} + +static void +datagram_test(void) +{ + struct sockaddr_un sun; + pid_t childpid; + int serverfd; + + serverfd = socket(PF_UNIX, SOCK_DGRAM, 0); + if (serverfd < 0) + err(-1, "datagram_test: socket"); + + bzero(&sun, sizeof(sun)); + sun.sun_len = sizeof(sun); + sun.sun_family = AF_UNIX; + strcpy(sun.sun_path, socket_path); + + if (bind(serverfd, (struct sockaddr *)&sun, sizeof(sun)) < 0) + err(-1, "datagram_test: bind"); + + childpid = fork(); + if (childpid < 0) + err(-1, "datagram_test: fork"); + + if (childpid != 0) { + sleep(1); + datagram_client(); + kill(childpid, SIGTERM); + sleep(1); + } else + datagram_server(serverfd); + + (void)unlink(socket_path); +} + +int +main(void) +{ + + if (mkstemp(socket_path) == -1) + err(1, "mkstemp failed"); + (void)unlink(socket_path); + datagram_test(); + if (0) + stream_test(); + return (0); +} Property changes on: user/ngie/more-tests/tests/sys/socket/unix_sendto_race_test.c ___________________________________________________________________ Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property