On Sun, Aug 29, 2021 at 02:00:44PM +0200, Theo Buehler wrote:
> Terminate the s_server after n clients connected to it. This is
> occasionally useful, matches OpenSSL's behavior and should help
> simplifying regress/usr.bin/openssl/x509.
>
hi.
> Index: openssl.1
> ===================================================================
> RCS file: /cvs/src/usr.bin/openssl/openssl.1,v
> retrieving revision 1.129
> diff -u -p -r1.129 openssl.1
> --- openssl.1 17 Mar 2021 18:08:32 -0000 1.129
> +++ openssl.1 28 Aug 2021 17:12:59 -0000
> @@ -4607,6 +4607,7 @@ will be used.
> .Op Fl keymatexportlen Ar len
> .Op Fl msg
> .Op Fl mtu Ar mtu
> +.Op Fl naccept Ar arg
i guess "arg" should be "num".
also i think it needs to be added to sv_usage in s_server.c.
otherwise doc parts ok.
jmc
> .Op Fl named_curve Ar arg
> .Op Fl nbio
> .Op Fl nbio_test
> @@ -4807,6 +4808,10 @@ Export len bytes of keying material (def
> Show all protocol messages with hex dump.
> .It Fl mtu Ar mtu
> Set the link layer MTU.
> +.It Fl naccept Ar num
> +Terminate server after
> +.Ar num
> +connections.
> .It Fl named_curve Ar arg
> Specify the elliptic curve name to use for ephemeral ECDH keys.
> This option is deprecated; use
> Index: s_apps.h
> ===================================================================
> RCS file: /cvs/src/usr.bin/openssl/s_apps.h,v
> retrieving revision 1.5
> diff -u -p -r1.5 s_apps.h
> --- s_apps.h 25 Apr 2018 07:12:33 -0000 1.5
> +++ s_apps.h 28 Aug 2021 17:12:59 -0000
> @@ -120,7 +120,7 @@ extern int verify_return_error;
>
> int do_server(int port, int type, int *ret,
> int (*cb)(char *hostname, int s, unsigned char *context),
> - unsigned char *context);
> + unsigned char *context, int naccept);
> #ifdef HEADER_X509_H
> int verify_callback(int ok, X509_STORE_CTX *ctx);
> #endif
> Index: s_server.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/openssl/s_server.c,v
> retrieving revision 1.47
> diff -u -p -r1.47 s_server.c
> --- s_server.c 17 Mar 2021 18:11:01 -0000 1.47
> +++ s_server.c 28 Aug 2021 17:17:38 -0000
> @@ -267,6 +267,7 @@ static struct {
> uint16_t min_version;
> const SSL_METHOD *meth;
> int msg;
> + int naccept;
> char *named_curve;
> int nbio;
> int nbio_test;
> @@ -741,6 +742,13 @@ static const struct option s_server_opti
> },
> #endif
> {
> + .name = "naccept",
> + .argname = "num",
> + .desc = "terminate after num connections",
> + .type = OPTION_ARG_INT,
> + .opt.value = &s_server_config.naccept
> + },
> + {
> .name = "named_curve",
> .argname = "arg",
> .type = OPTION_ARG,
> @@ -1084,6 +1092,7 @@ s_server_main(int argc, char *argv[])
> memset(&s_server_config, 0, sizeof(s_server_config));
> s_server_config.keymatexportlen = 20;
> s_server_config.meth = TLS_server_method();
> + s_server_config.naccept = -1;
> s_server_config.port = PORT;
> s_server_config.cert_file = TEST_CERT;
> s_server_config.cert_file2 = TEST_CERT2;
> @@ -1465,10 +1474,12 @@ s_server_main(int argc, char *argv[])
> (void) BIO_flush(bio_s_out);
> if (s_server_config.www)
> do_server(s_server_config.port, s_server_config.socket_type,
> - &accept_socket, www_body, s_server_config.context);
> + &accept_socket, www_body, s_server_config.context,
> + s_server_config.naccept);
> else
> do_server(s_server_config.port, s_server_config.socket_type,
> - &accept_socket, sv_body, s_server_config.context);
> + &accept_socket, sv_body, s_server_config.context,
> + s_server_config.naccept);
> print_stats(bio_s_out, ctx);
> ret = 0;
> end:
> Index: s_socket.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/openssl/s_socket.c,v
> retrieving revision 1.11
> diff -u -p -r1.11 s_socket.c
> --- s_socket.c 28 Jun 2019 13:35:02 -0000 1.11
> +++ s_socket.c 28 Aug 2021 17:12:59 -0000
> @@ -132,7 +132,7 @@ init_client(int *sock, char *host, char
> int
> do_server(int port, int type, int *ret,
> int (*cb) (char *hostname, int s, unsigned char *context),
> - unsigned char *context)
> + unsigned char *context, int naccept)
> {
> int sock;
> char *name = NULL;
> @@ -161,7 +161,9 @@ do_server(int port, int type, int *ret,
> shutdown(sock, SHUT_RDWR);
> close(sock);
> }
> - if (i < 0) {
> + if (naccept != -1)
> + naccept--;
> + if (i < 0 || naccept == 0) {
> shutdown(accept_socket, SHUT_RDWR);
> close(accept_socket);
> return (i);
>