diff options
author | 2020-01-17 20:45:50 +0000 | |
---|---|---|
committer | 2020-01-17 20:45:50 +0000 | |
commit | f214d6d23b8aa46e571a0bb61bc7293d5679d858 (patch) | |
tree | 4953477f3cb5e10a0f4654bb5d09c3270caa3303 | |
parent | Document loading of resident keys from a FIDO authenticator. (diff) | |
download | wireguard-openbsd-f214d6d23b8aa46e571a0bb61bc7293d5679d858.tar.xz wireguard-openbsd-f214d6d23b8aa46e571a0bb61bc7293d5679d858.zip |
Test the netcat -N feature. The test program can send and receive
messages, shutdown write, and wait for EOF in arbitray order. Since
revision 1.211 of netcat.c some of the cases fail.
-rw-r--r-- | regress/usr.bin/nc/Makefile | 132 | ||||
-rw-r--r-- | regress/usr.bin/nc/client-tcp.c | 24 | ||||
-rw-r--r-- | regress/usr.bin/nc/server-tcp.c | 27 | ||||
-rw-r--r-- | regress/usr.bin/nc/util.c | 81 | ||||
-rw-r--r-- | regress/usr.bin/nc/util.h | 11 |
5 files changed, 242 insertions, 33 deletions
diff --git a/regress/usr.bin/nc/Makefile b/regress/usr.bin/nc/Makefile index 30ae4b825cf..bf4ceea9ede 100644 --- a/regress/usr.bin/nc/Makefile +++ b/regress/usr.bin/nc/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.4 2020/01/16 21:11:17 bluhm Exp $ +# $OpenBSD: Makefile,v 1.5 2020/01/17 20:45:50 bluhm Exp $ # Copyright (c) 2020 Alexander Bluhm <bluhm@openbsd.org> # @@ -893,13 +893,23 @@ run-unix-dgram-keep: # XXX message succeeded is missing ! grep 'Connection to 127.0.0.1 .* succeeded!' client.err -### TCP with custom peer +### TCP with test peer -REGRESS_TARGETS += run-tcp-custom -run-tcp-custom: server-tcp client-tcp +REGRESS_TARGETS += run-tcp-test +run-tcp-test: server-tcp client-tcp @echo '======== $@ ========' + # test the test tools ./server-tcp -s greeting -r command 127.0.0.1 0 >server.port - ./client-tcp -r greeting -s command 127.0.0.1 ${PORT} + ./client-tcp -r greeting -s command 127.0.0.1 ${PORT} >client.port + +REGRESS_TARGETS += run-tcp-test-shutdown +run-tcp-test-shutdown: server-tcp client-tcp + @echo '======== $@ ========' + # test the test tools + ./server-tcp -s greeting -N -r command -E 127.0.0.1 0 >server.port + ./client-tcp -r greeting -E -s command -N 127.0.0.1 ${PORT} >client.port + +# TCP netcat server with test client REGRESS_TARGETS += run-tcp-server run-tcp-server: client-tcp @@ -907,15 +917,73 @@ run-tcp-server: client-tcp ${SERVER_NC} -n -v -l 127.0.0.1 0 ${SERVER_BG} ${LISTEN_WAIT} ${PORT_GET} - ./client-tcp -r greeting -s command 127.0.0.1 ${PORT} + # test client read from netcat, then send line and exit + ./client-tcp -r greeting -s command 127.0.0.1 ${PORT} >client.port ${TRANSFER_SERVER_WAIT} grep '^command$$' server.out grep 'Listening on 127.0.0.1 ' server.err grep 'Connection received on 127.0.0.1 ' server.err +REGRESS_TARGETS += run-tcp-server-eof +run-tcp-server-eof: client-tcp + @echo '======== $@ ========' + ${SERVER_NC} -n -v -l 127.0.0.1 0 ${SERVER_BG} + ${LISTEN_WAIT} + ${PORT_GET} + # test client read from netcat, then send line, shutdown, wait for eof + ./client-tcp -r greeting -s command -N -E 127.0.0.1 ${PORT} >client.port + ${TRANSFER_SERVER_WAIT} + grep '^command$$' server.out + grep 'Listening on 127.0.0.1 ' server.err + grep 'Connection received on 127.0.0.1 ' server.err + +REGRESS_TARGETS += run-tcp-server-reverse-eof +run-tcp-server-reverse-eof: client-tcp + @echo '======== $@ ========' + ${SERVER_NC} -n -v -l 127.0.0.1 0 ${SERVER_BG} + ${LISTEN_WAIT} + ${PORT_GET} + # test client send to netcat, shutdown, then read line, wait for eof + ./client-tcp -s command -N -r greeting -E 127.0.0.1 ${PORT} >client.port + ${TRANSFER_SERVER_WAIT} + grep '^command$$' server.out + grep 'Listening on 127.0.0.1 ' server.err + grep 'Connection received on 127.0.0.1 ' server.err + +REGRESS_TARGETS += run-tcp-server-shutdown-eof +run-tcp-server-shutdown-eof: client-tcp + @echo '======== $@ ========' + # netcat calls shutdown on output after EOF on input + ${SERVER_NC} -N -n -v -l 127.0.0.1 0 ${SERVER_BG} + ${LISTEN_WAIT} + ${PORT_GET} + # test client read from netcat, then send line, wait for eof, shutdown + ./client-tcp -r greeting -s command -E -N 127.0.0.1 ${PORT} >client.port + ${TRANSFER_SERVER_WAIT} + grep '^command$$' server.out + grep 'Listening on 127.0.0.1 ' server.err + grep 'Connection received on 127.0.0.1 ' server.err + +REGRESS_TARGETS += run-tcp-server-shutdown-reverse-eof +run-tcp-server-shutdown-reverse-eof: client-tcp + @echo '======== $@ ========' + # netcat calls shutdown on output after EOF on input + ${SERVER_NC} -N -n -v -l 127.0.0.1 0 ${SERVER_BG} + ${LISTEN_WAIT} + ${PORT_GET} + # test client send to netcat, shutdown, then read line, wait for eof + ./client-tcp -s command -N -r greeting -E 127.0.0.1 ${PORT} >client.port + ${TRANSFER_SERVER_WAIT} + grep '^command$$' server.out + grep 'Listening on 127.0.0.1 ' server.err + grep 'Connection received on 127.0.0.1 ' server.err + +# TCP netcat client with test server + REGRESS_TARGETS += run-tcp-client run-tcp-client: server-tcp @echo '======== $@ ========' + # test server send to netcat, then read line and exit ./server-tcp -s greeting -r command 127.0.0.1 0 >server.port ${CLIENT_NC} -n -v 127.0.0.1 ${PORT} ${CLIENT_BG} ${CONNECT_WAIT} @@ -923,6 +991,58 @@ run-tcp-client: server-tcp grep '^greeting$$' client.out grep 'Connection to 127.0.0.1 .* succeeded!' client.err +REGRESS_TARGETS += run-tcp-client-eof +run-tcp-client-eof: server-tcp + @echo '======== $@ ========' + # test server send to netcat, shutdown, then read line, wait for eof + ./server-tcp -s greeting -N -r command -E 127.0.0.1 0 >server.port + ${CLIENT_NC} -n -v 127.0.0.1 ${PORT} ${CLIENT_BG} + ${CONNECT_WAIT} + ${TRANSFER_CLIENT_WAIT} + grep '^greeting$$' client.out + grep 'Connection to 127.0.0.1 .* succeeded!' client.err + +REGRESS_TARGETS += run-tcp-client-reverse-eof +run-tcp-client-reverse-eof: server-tcp + @echo '======== $@ ========' + # test server read from netcat, then read line, wait for eof, shutdown + ./server-tcp -r command -s greeting -E -N 127.0.0.1 0 >server.port + ${CLIENT_NC} -n -v 127.0.0.1 ${PORT} ${CLIENT_BG} + ${CONNECT_WAIT} + ${TRANSFER_CLIENT_WAIT} + grep '^greeting$$' client.out + grep 'Connection to 127.0.0.1 .* succeeded!' client.err + +REGRESS_TARGETS += run-tcp-client-shutdown-eof +run-tcp-client-shutdown-eof: server-tcp + @echo '======== $@ ========' + # test server send to netcat, shutdown, then read line, wait for eof + ./server-tcp -s greeting -N -r command -E 127.0.0.1 0 >server.port + # netcat calls shutdown on output after EOF on input + ${CLIENT_NC} -N -n -v 127.0.0.1 ${PORT} ${CLIENT_BG} + ${CONNECT_WAIT} + ${TRANSFER_CLIENT_WAIT} + grep '^greeting$$' client.out + grep 'Connection to 127.0.0.1 .* succeeded!' client.err + +REGRESS_TARGETS += run-tcp-client-shutdown-reverse-eof +run-tcp-client-shutdown-reverse-eof: server-tcp + @echo '======== $@ ========' + # test server read from netcat, wait for eof, then read line, shutdown + ./server-tcp -r command -E -s greeting -N 127.0.0.1 0 >server.port + # netcat calls shutdown on output after EOF on input + ${CLIENT_NC} -N -n -v 127.0.0.1 ${PORT} ${CLIENT_BG} + ${CONNECT_WAIT} + ${TRANSFER_CLIENT_WAIT} + grep '^greeting$$' client.out + grep 'Connection to 127.0.0.1 .* succeeded!' client.err + +REGRESS_EXPECTED_FAILURES = \ + run-tcp-server-shutdown-eof \ + run-tcp-server-shutdown-reverse-eof \ + run-tcp-client-shutdown-eof \ + run-tcp-client-shutdown-reverse-eof + .PHONY: ${REGRESS_SETUP} ${REGRESS_CLEANUP} ${REGRESS_TARGETS} ### create certificates for TLS diff --git a/regress/usr.bin/nc/client-tcp.c b/regress/usr.bin/nc/client-tcp.c index 09938848409..b26c3f3695f 100644 --- a/regress/usr.bin/nc/client-tcp.c +++ b/regress/usr.bin/nc/client-tcp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: client-tcp.c,v 1.1 2020/01/16 21:11:17 bluhm Exp $ */ +/* $OpenBSD: client-tcp.c,v 1.2 2020/01/17 20:45:50 bluhm Exp $ */ /* * Copyright (c) 2020 Alexander Bluhm <bluhm@openbsd.org> @@ -36,6 +36,8 @@ void __dead usage(void) { fprintf(stderr, "client [-r rcvmsg] [-s sndmsg] host port\n" + " -E wait for EOF\n" + " -N shutdown write\n" " -r rcvmsg receive from server and check message\n" " -s sndmsg send message to server\n"); exit(2); @@ -45,16 +47,20 @@ int main(int argc, char *argv[]) { const char *host, *port; - const char *rcvmsg = NULL, *sndmsg = NULL; + struct task todo[100]; + size_t tlen = 0; int ch, s; - while ((ch = getopt(argc, argv, "r:s:")) != -1) { + while ((ch = getopt(argc, argv, "ENr:s:")) != -1) { switch (ch) { + case 'E': + case 'N': case 'r': - rcvmsg = optarg; - break; case 's': - sndmsg = optarg; + if (tlen >= sizeof(todo) / sizeof(todo[0])) + errx(1, "too many tasks"); + task_enqueue(&todo[tlen], ch, optarg); + tlen++; break; default: usage(); @@ -74,11 +80,7 @@ main(int argc, char *argv[]) s = connect_socket(host, port); print_sockname(s); print_peername(s); - if (rcvmsg != NULL) - receive_line(s, rcvmsg); - if (sndmsg != NULL) - send_line(s, sndmsg); - + task_run(s, todo, tlen); if (close(s) == -1) err(1, "close"); diff --git a/regress/usr.bin/nc/server-tcp.c b/regress/usr.bin/nc/server-tcp.c index 07a2a49500d..31c619f5fad 100644 --- a/regress/usr.bin/nc/server-tcp.c +++ b/regress/usr.bin/nc/server-tcp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: server-tcp.c,v 1.1 2020/01/16 21:11:17 bluhm Exp $ */ +/* $OpenBSD: server-tcp.c,v 1.2 2020/01/17 20:45:50 bluhm Exp $ */ /* * Copyright (c) 2020 Alexander Bluhm <bluhm@openbsd.org> @@ -37,6 +37,8 @@ void __dead usage(void) { fprintf(stderr, "server-tcp [-r rcvmsg] [-s sndmsg] host port\n" + " -E wait for EOF\n" + " -N shutdown write\n" " -r rcvmsg receive from client and check message\n" " -s sndmsg send message to client\n"); exit(2); @@ -46,16 +48,20 @@ int main(int argc, char *argv[]) { const char *host, *port; - const char *rcvmsg = NULL, *sndmsg = NULL; + struct task todo[100]; + size_t tlen = 0; int ch, s; - while ((ch = getopt(argc, argv, "r:s:")) != -1) { + while ((ch = getopt(argc, argv, "ENr:s:")) != -1) { switch (ch) { + case 'E': + case 'N': case 'r': - rcvmsg = optarg; - break; case 's': - sndmsg = optarg; + if (tlen >= sizeof(todo) / sizeof(todo[0])) + errx(1, "too many tasks"); + task_enqueue(&todo[tlen], ch, optarg); + tlen++; break; default: usage(); @@ -79,7 +85,8 @@ main(int argc, char *argv[]) case -1: err(1, "fork"); case 0: - /* child continues */ + /* child continues, set timer for new process */ + alarm_timeout(); break; default: /* parent exits and test runs in parallel */ @@ -87,11 +94,7 @@ main(int argc, char *argv[]) } s = accept_socket(s); - if (sndmsg != NULL) - send_line(s, sndmsg); - if (rcvmsg != NULL) - receive_line(s, rcvmsg); - + task_run(s, todo, tlen); if (close(s) == -1) err(1, "close"); diff --git a/regress/usr.bin/nc/util.c b/regress/usr.bin/nc/util.c index ac96190fc8d..46c8bfe1520 100644 --- a/regress/usr.bin/nc/util.c +++ b/regress/usr.bin/nc/util.c @@ -1,4 +1,4 @@ -/* $OpenBSD: util.c,v 1.1 2020/01/16 21:11:17 bluhm Exp $ */ +/* $OpenBSD: util.c,v 1.2 2020/01/17 20:45:50 bluhm Exp $ */ /* * Copyright (c) 2020 Alexander Bluhm <bluhm@openbsd.org> @@ -30,6 +30,52 @@ #include "util.h" void +task_enqueue(struct task *todo, int ch, const char *msg) +{ + switch (ch) { + case 'E': + todo->t_type = TEOF; + todo->t_msg = NULL; + break; + case 'N': + todo->t_type = TDWN; + todo->t_msg = NULL; + break; + case 'r': + todo->t_type = TRCV; + todo->t_msg = msg; + break; + case 's': + todo->t_type = TSND; + todo->t_msg = msg; + break; + } +} + +void +task_run(int s, struct task *todolist, size_t tlen) +{ + size_t t; + + for (t = 0; t < tlen; t++) { + switch(todolist[t].t_type) { + case TEOF: + receive_eof(s); + break; + case TDWN: + send_shutdown(s); + break; + case TRCV: + receive_line(s, todolist[t].t_msg); + break; + case TSND: + send_line(s, todolist[t].t_msg); + break; + } + } +} + +void alarm_timeout(void) { /* just abort after 10 seconds */ @@ -73,6 +119,35 @@ print_peername(int s) } void +receive_eof(int s) +{ + char buf[100]; + size_t len; + ssize_t n; + + n = recv(s, buf, sizeof(buf) - 1, 0); + if (n == -1) + err(1, "recv"); + if (n == 0) { + fprintf(stderr, "<<< EOF\n"); + return; + } + len = n; + buf[len] = '\0'; + if (buf[len - 1] == '\n') + buf[--len] = '\0'; + fprintf(stderr, "<<< %s\n", buf); + errx(1, "expected receive EOF, got '%s'", buf); +} + +void +send_shutdown(int s) +{ + if (shutdown(s, SHUT_WR) == -1) + err(1, "shutdown"); +} + +void receive_line(int s, const char *msg) { char buf[100]; @@ -80,9 +155,9 @@ receive_line(int s, const char *msg) ssize_t n; len = 0; - while (len < sizeof(buf)) { + while (len < sizeof(buf) - 1) { off = len; - n = recv(s, buf + off, sizeof(buf) - off, 0); + n = recv(s, buf + off, sizeof(buf) - 1 - off, 0); if (n == -1) err(1, "recv"); if (n == 0) { diff --git a/regress/usr.bin/nc/util.h b/regress/usr.bin/nc/util.h index f70b6865ac7..71765a486ea 100644 --- a/regress/usr.bin/nc/util.h +++ b/regress/usr.bin/nc/util.h @@ -1,4 +1,4 @@ -/* $OpenBSD: util.h,v 1.1 2020/01/16 21:11:17 bluhm Exp $ */ +/* $OpenBSD: util.h,v 1.2 2020/01/17 20:45:50 bluhm Exp $ */ /* * Copyright (c) 2020 Alexander Bluhm <bluhm@openbsd.org> @@ -16,8 +16,17 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +struct task { + const char *t_msg; + enum { TEOF, TDWN, TRCV, TSND } t_type; +}; + +void task_enqueue(struct task *, int, const char *); +void task_run(int, struct task *, size_t); void alarm_timeout(void); void print_sockname(int); void print_peername(int); +void receive_eof(int); +void send_shutdown(int); void receive_line(int, const char *); void send_line(int, const char *); |