diff options
| author | tb <> | 2021-12-06 11:06:58 +0000 |
|---|---|---|
| committer | tb <> | 2021-12-06 11:06:58 +0000 |
| commit | d41743ea4a2d346f9a3661d5b6f9a056383e90eb (patch) | |
| tree | 55bcc3ded6ebb2898bb541a7b58b36f5c9bc096d | |
| parent | 14494d6d322e4ba091e6c7c40262b53340b24485 (diff) | |
| download | openbsd-d41743ea4a2d346f9a3661d5b6f9a056383e90eb.tar.gz openbsd-d41743ea4a2d346f9a3661d5b6f9a056383e90eb.tar.bz2 openbsd-d41743ea4a2d346f9a3661d5b6f9a056383e90eb.zip | |
Clean up a bunch of dead code in s_server.c and s_socket.c
jsg's analysis tool flagged a potential double free in do_server().
While this looks like a false positive, we can clean this code up
a little: the host name passed to the callbacks isn't used by either
sv_body() and www_body(), so it can be made local to do_accept()
(an extra variable would not even be needed). Simplify the callbacks'
signatures accordingly. Remove some commented out linger code that
would never be used again anyway.
ok inoguchi jsg
| -rw-r--r-- | src/usr.bin/openssl/s_apps.h | 4 | ||||
| -rw-r--r-- | src/usr.bin/openssl/s_server.c | 10 | ||||
| -rw-r--r-- | src/usr.bin/openssl/s_socket.c | 43 |
3 files changed, 21 insertions, 36 deletions
diff --git a/src/usr.bin/openssl/s_apps.h b/src/usr.bin/openssl/s_apps.h index f535a35c39..a73c2eb1b4 100644 --- a/src/usr.bin/openssl/s_apps.h +++ b/src/usr.bin/openssl/s_apps.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: s_apps.h,v 1.6 2021/08/29 12:33:15 tb Exp $ */ | 1 | /* $OpenBSD: s_apps.h,v 1.7 2021/12/06 11:06:58 tb Exp $ */ |
| 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
| 3 | * All rights reserved. | 3 | * All rights reserved. |
| 4 | * | 4 | * |
| @@ -119,7 +119,7 @@ extern int verify_depth; | |||
| 119 | extern int verify_return_error; | 119 | extern int verify_return_error; |
| 120 | 120 | ||
| 121 | int do_server(int port, int type, int *ret, | 121 | int do_server(int port, int type, int *ret, |
| 122 | int (*cb)(char *hostname, int s, unsigned char *context), | 122 | int (*cb)(int s, unsigned char *context), |
| 123 | unsigned char *context, int naccept); | 123 | unsigned char *context, int naccept); |
| 124 | #ifdef HEADER_X509_H | 124 | #ifdef HEADER_X509_H |
| 125 | int verify_callback(int ok, X509_STORE_CTX *ctx); | 125 | int verify_callback(int ok, X509_STORE_CTX *ctx); |
diff --git a/src/usr.bin/openssl/s_server.c b/src/usr.bin/openssl/s_server.c index 233b8fdced..9b06856ac9 100644 --- a/src/usr.bin/openssl/s_server.c +++ b/src/usr.bin/openssl/s_server.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: s_server.c,v 1.53 2021/10/31 16:47:27 tb Exp $ */ | 1 | /* $OpenBSD: s_server.c,v 1.54 2021/12/06 11:06:58 tb Exp $ */ |
| 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
| 3 | * All rights reserved. | 3 | * All rights reserved. |
| 4 | * | 4 | * |
| @@ -180,13 +180,13 @@ | |||
| 180 | static void s_server_init(void); | 180 | static void s_server_init(void); |
| 181 | static void sv_usage(void); | 181 | static void sv_usage(void); |
| 182 | static void print_stats(BIO *bp, SSL_CTX *ctx); | 182 | static void print_stats(BIO *bp, SSL_CTX *ctx); |
| 183 | static int sv_body(char *hostname, int s, unsigned char *context); | 183 | static int sv_body(int s, unsigned char *context); |
| 184 | static void close_accept_socket(void); | 184 | static void close_accept_socket(void); |
| 185 | static int init_ssl_connection(SSL *s); | 185 | static int init_ssl_connection(SSL *s); |
| 186 | #ifndef OPENSSL_NO_DH | 186 | #ifndef OPENSSL_NO_DH |
| 187 | static DH *load_dh_param(const char *dhfile); | 187 | static DH *load_dh_param(const char *dhfile); |
| 188 | #endif | 188 | #endif |
| 189 | static int www_body(char *hostname, int s, unsigned char *context); | 189 | static int www_body(int s, unsigned char *context); |
| 190 | static int generate_session_id(const SSL *ssl, unsigned char *id, | 190 | static int generate_session_id(const SSL *ssl, unsigned char *id, |
| 191 | unsigned int *id_len); | 191 | unsigned int *id_len); |
| 192 | static int ssl_servername_cb(SSL *s, int *ad, void *arg); | 192 | static int ssl_servername_cb(SSL *s, int *ad, void *arg); |
| @@ -1531,7 +1531,7 @@ print_stats(BIO *bio, SSL_CTX *ssl_ctx) | |||
| 1531 | } | 1531 | } |
| 1532 | 1532 | ||
| 1533 | static int | 1533 | static int |
| 1534 | sv_body(char *hostname, int s, unsigned char *context) | 1534 | sv_body(int s, unsigned char *context) |
| 1535 | { | 1535 | { |
| 1536 | char *buf = NULL; | 1536 | char *buf = NULL; |
| 1537 | int ret = 1; | 1537 | int ret = 1; |
| @@ -1956,7 +1956,7 @@ load_dh_param(const char *dhfile) | |||
| 1956 | #endif | 1956 | #endif |
| 1957 | 1957 | ||
| 1958 | static int | 1958 | static int |
| 1959 | www_body(char *hostname, int s, unsigned char *context) | 1959 | www_body(int s, unsigned char *context) |
| 1960 | { | 1960 | { |
| 1961 | char *buf = NULL; | 1961 | char *buf = NULL; |
| 1962 | int ret = 1; | 1962 | int ret = 1; |
diff --git a/src/usr.bin/openssl/s_socket.c b/src/usr.bin/openssl/s_socket.c index f22c88d228..db125c1ed3 100644 --- a/src/usr.bin/openssl/s_socket.c +++ b/src/usr.bin/openssl/s_socket.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: s_socket.c,v 1.12 2021/08/29 12:33:15 tb Exp $ */ | 1 | /* $OpenBSD: s_socket.c,v 1.13 2021/12/06 11:06:58 tb Exp $ */ |
| 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
| 3 | * All rights reserved. | 3 | * All rights reserved. |
| 4 | * | 4 | * |
| @@ -75,7 +75,7 @@ | |||
| 75 | 75 | ||
| 76 | static int init_server(int *sock, int port, int type); | 76 | static int init_server(int *sock, int port, int type); |
| 77 | static int init_server_long(int *sock, int port, char *ip, int type); | 77 | static int init_server_long(int *sock, int port, char *ip, int type); |
| 78 | static int do_accept(int acc_sock, int *sock, char **host); | 78 | static int do_accept(int acc_sock, int *sock); |
| 79 | 79 | ||
| 80 | int | 80 | int |
| 81 | init_client(int *sock, char *host, char *port, int type, int af) | 81 | init_client(int *sock, char *host, char *port, int type, int af) |
| @@ -131,11 +131,10 @@ init_client(int *sock, char *host, char *port, int type, int af) | |||
| 131 | 131 | ||
| 132 | int | 132 | int |
| 133 | do_server(int port, int type, int *ret, | 133 | do_server(int port, int type, int *ret, |
| 134 | int (*cb) (char *hostname, int s, unsigned char *context), | 134 | int (*cb)(int s, unsigned char *context), |
| 135 | unsigned char *context, int naccept) | 135 | unsigned char *context, int naccept) |
| 136 | { | 136 | { |
| 137 | int sock; | 137 | int sock; |
| 138 | char *name = NULL; | ||
| 139 | int accept_socket = 0; | 138 | int accept_socket = 0; |
| 140 | int i; | 139 | int i; |
| 141 | 140 | ||
| @@ -148,15 +147,14 @@ do_server(int port, int type, int *ret, | |||
| 148 | } | 147 | } |
| 149 | for (;;) { | 148 | for (;;) { |
| 150 | if (type == SOCK_STREAM) { | 149 | if (type == SOCK_STREAM) { |
| 151 | if (do_accept(accept_socket, &sock, &name) == 0) { | 150 | if (do_accept(accept_socket, &sock) == 0) { |
| 152 | shutdown(accept_socket, SHUT_RD); | 151 | shutdown(accept_socket, SHUT_RD); |
| 153 | close(accept_socket); | 152 | close(accept_socket); |
| 154 | return (0); | 153 | return (0); |
| 155 | } | 154 | } |
| 156 | } else | 155 | } else |
| 157 | sock = accept_socket; | 156 | sock = accept_socket; |
| 158 | i = (*cb) (name, sock, context); | 157 | i = cb(sock, context); |
| 159 | free(name); | ||
| 160 | if (type == SOCK_STREAM) { | 158 | if (type == SOCK_STREAM) { |
| 161 | shutdown(sock, SHUT_RDWR); | 159 | shutdown(sock, SHUT_RDWR); |
| 162 | close(sock); | 160 | close(sock); |
| @@ -227,13 +225,13 @@ init_server(int *sock, int port, int type) | |||
| 227 | } | 225 | } |
| 228 | 226 | ||
| 229 | static int | 227 | static int |
| 230 | do_accept(int acc_sock, int *sock, char **host) | 228 | do_accept(int acc_sock, int *sock) |
| 231 | { | 229 | { |
| 232 | int ret; | ||
| 233 | struct hostent *h1, *h2; | 230 | struct hostent *h1, *h2; |
| 234 | static struct sockaddr_in from; | 231 | static struct sockaddr_in from; |
| 235 | socklen_t len; | 232 | socklen_t len; |
| 236 | /* struct linger ling; */ | 233 | char *host = NULL; |
| 234 | int ret; | ||
| 237 | 235 | ||
| 238 | redoit: | 236 | redoit: |
| 239 | 237 | ||
| @@ -249,47 +247,34 @@ do_accept(int acc_sock, int *sock, char **host) | |||
| 249 | perror("accept"); | 247 | perror("accept"); |
| 250 | return (0); | 248 | return (0); |
| 251 | } | 249 | } |
| 252 | /* | 250 | |
| 253 | ling.l_onoff=1; | ||
| 254 | ling.l_linger=0; | ||
| 255 | i=setsockopt(ret,SOL_SOCKET,SO_LINGER,(char *)&ling,sizeof(ling)); | ||
| 256 | if (i == -1) { perror("linger"); return(0); } | ||
| 257 | i=0; | ||
| 258 | i=setsockopt(ret,SOL_SOCKET,SO_KEEPALIVE,(char *)&i,sizeof(i)); | ||
| 259 | if (i == -1) { perror("keepalive"); return(0); } | ||
| 260 | */ | ||
| 261 | |||
| 262 | if (host == NULL) | ||
| 263 | goto end; | ||
| 264 | h1 = gethostbyaddr((char *) &from.sin_addr.s_addr, | 251 | h1 = gethostbyaddr((char *) &from.sin_addr.s_addr, |
| 265 | sizeof(from.sin_addr.s_addr), AF_INET); | 252 | sizeof(from.sin_addr.s_addr), AF_INET); |
| 266 | if (h1 == NULL) { | 253 | if (h1 == NULL) { |
| 267 | BIO_printf(bio_err, "bad gethostbyaddr\n"); | 254 | BIO_printf(bio_err, "bad gethostbyaddr\n"); |
| 268 | *host = NULL; | ||
| 269 | /* return(0); */ | ||
| 270 | } else { | 255 | } else { |
| 271 | if ((*host = strdup(h1->h_name)) == NULL) { | 256 | if ((host = strdup(h1->h_name)) == NULL) { |
| 272 | perror("strdup"); | 257 | perror("strdup"); |
| 273 | close(ret); | 258 | close(ret); |
| 274 | return (0); | 259 | return (0); |
| 275 | } | 260 | } |
| 276 | 261 | ||
| 277 | h2 = gethostbyname(*host); | 262 | h2 = gethostbyname(host); |
| 278 | if (h2 == NULL) { | 263 | if (h2 == NULL) { |
| 279 | BIO_printf(bio_err, "gethostbyname failure\n"); | 264 | BIO_printf(bio_err, "gethostbyname failure\n"); |
| 280 | close(ret); | 265 | close(ret); |
| 281 | free(*host); | 266 | free(host); |
| 282 | return (0); | 267 | return (0); |
| 283 | } | 268 | } |
| 284 | if (h2->h_addrtype != AF_INET) { | 269 | if (h2->h_addrtype != AF_INET) { |
| 285 | BIO_printf(bio_err, "gethostbyname addr is not AF_INET\n"); | 270 | BIO_printf(bio_err, "gethostbyname addr is not AF_INET\n"); |
| 286 | close(ret); | 271 | close(ret); |
| 287 | free(*host); | 272 | free(host); |
| 288 | return (0); | 273 | return (0); |
| 289 | } | 274 | } |
| 290 | } | 275 | } |
| 291 | 276 | ||
| 292 | end: | 277 | free(host); |
| 293 | *sock = ret; | 278 | *sock = ret; |
| 294 | return (1); | 279 | return (1); |
| 295 | } | 280 | } |
