From b13fdc4860b5e1bf615b113950788a138e68ae7f Mon Sep 17 00:00:00 2001 From: Andy Polyakov Date: Wed, 30 Sep 2015 10:15:03 +0200 Subject: [PATCH] Explicitly cast INVALID_SOCKET to (int) to address warnings on Windows. Even though SOCKET is effectively declared as (void *) on Windows, it's not actually a pointer, but an index within per-process table of kernel objects. The table size is actually limited and its upper limit is far below upper limit for signed 32-bit integer. This is what makes cast in question possible. Reviewed-by: Richard Levitte Reviewed-by: Tim Hudson --- apps/s_socket.c | 12 ++++++------ crypto/bio/b_sock.c | 20 ++++++++++---------- crypto/bio/bss_acpt.c | 12 ++++++------ crypto/bio/bss_conn.c | 8 ++++---- e_os.h | 4 +++- 5 files changed, 29 insertions(+), 27 deletions(-) diff --git a/apps/s_socket.c b/apps/s_socket.c index c1faffc494..9d1f04a6c5 100644 --- a/apps/s_socket.c +++ b/apps/s_socket.c @@ -266,7 +266,7 @@ static int init_client_ip(int *sock, const unsigned char ip[4], int port, else /* ( type == SOCK_DGRAM) */ s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (s == INVALID_SOCKET) { + if (s == (int)INVALID_SOCKET) { perror("socket"); return (0); } @@ -303,7 +303,7 @@ int init_client_unix(int *sock, const char *server) return (0); s = socket(AF_UNIX, SOCK_STREAM, 0); - if (s == INVALID_SOCKET) { + if (s == (int)INVALID_SOCKET) { perror("socket"); return (0); } @@ -428,7 +428,7 @@ static int init_server_long(int *sock, int port, char *ip, int type) else /* type == SOCK_DGRAM */ s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); - if (s == INVALID_SOCKET) + if (s == (int)INVALID_SOCKET) goto err; # if defined SOL_SOCKET && defined SO_REUSEADDR { @@ -472,7 +472,7 @@ static int init_server_unix(int *sock, const char *path) return (0); s = socket(AF_UNIX, SOCK_STREAM, 0); - if (s == INVALID_SOCKET) + if (s == (int)INVALID_SOCKET) goto err; memset(&server, 0, sizeof(server)); @@ -527,7 +527,7 @@ static int do_accept(int acc_sock, int *sock, char **host) * can either go for (int *) or (void *). */ ret = accept(acc_sock, (struct sockaddr *)&from, (void *)&len); - if (ret == INVALID_SOCKET) { + if (ret == (int)INVALID_SOCKET) { # if defined(OPENSSL_SYS_WINDOWS) || (defined(OPENSSL_SYS_NETWARE) && !defined(NETWARE_BSDSOCK)) int i; i = WSAGetLastError(); @@ -589,7 +589,7 @@ static int do_accept_unix(int acc_sock, int *sock) redoit: ret = accept(acc_sock, NULL, NULL); - if (ret == INVALID_SOCKET) { + if (ret == (int)INVALID_SOCKET) { if (errno == EINTR) { /* * check_timeout(); diff --git a/crypto/bio/b_sock.c b/crypto/bio/b_sock.c index 48e40360ad..e536eda2a6 100644 --- a/crypto/bio/b_sock.c +++ b/crypto/bio/b_sock.c @@ -391,7 +391,7 @@ int BIO_get_accept_socket(char *host, int bind_mode) struct sockaddr_in6 sa_in6; # endif } server, client; - int s = INVALID_SOCKET, cs, addrlen; + int s = (int)INVALID_SOCKET, cs, addrlen; unsigned char ip[4]; unsigned short port; char *str = NULL, *e; @@ -400,10 +400,10 @@ int BIO_get_accept_socket(char *host, int bind_mode) int err_num; if (BIO_sock_init() != 1) - return (INVALID_SOCKET); + return ((int)INVALID_SOCKET); if ((str = BUF_strdup(host)) == NULL) - return (INVALID_SOCKET); + return ((int)INVALID_SOCKET); h = p = NULL; h = str; @@ -503,7 +503,7 @@ int BIO_get_accept_socket(char *host, int bind_mode) again: s = socket(server.sa.sa_family, SOCK_STREAM, SOCKET_PROTOCOL); - if (s == INVALID_SOCKET) { + if (s == (int)INVALID_SOCKET) { SYSerr(SYS_F_SOCKET, get_last_socket_error()); ERR_add_error_data(3, "port='", host, "'"); BIOerr(BIO_F_BIO_GET_ACCEPT_SOCKET, BIO_R_UNABLE_TO_CREATE_SOCKET); @@ -545,11 +545,11 @@ int BIO_get_accept_socket(char *host, int bind_mode) goto err; } cs = socket(client.sa.sa_family, SOCK_STREAM, SOCKET_PROTOCOL); - if (cs != INVALID_SOCKET) { + if (cs != (int)INVALID_SOCKET) { int ii; ii = connect(cs, &client.sa, addrlen); closesocket(cs); - if (ii == INVALID_SOCKET) { + if (ii == (int)INVALID_SOCKET) { bind_mode = BIO_BIND_REUSEADDR; closesocket(s); goto again; @@ -573,16 +573,16 @@ int BIO_get_accept_socket(char *host, int bind_mode) ret = 1; err: OPENSSL_free(str); - if ((ret == 0) && (s != INVALID_SOCKET)) { + if ((ret == 0) && (s != (int)INVALID_SOCKET)) { closesocket(s); - s = INVALID_SOCKET; + s = (int)INVALID_SOCKET; } return (s); } int BIO_accept(int sock, char **addr) { - int ret = INVALID_SOCKET; + int ret = (int)INVALID_SOCKET; unsigned long l; unsigned short port; char *p; @@ -631,7 +631,7 @@ int BIO_accept(int sock, char **addr) sa.len.i = (int)sa.len.s; /* use sa.len.i from this point */ } - if (ret == INVALID_SOCKET) { + if (ret == (int)INVALID_SOCKET) { if (BIO_sock_should_retry(ret)) return -2; SYSerr(SYS_F_ACCEPT, get_last_socket_error()); diff --git a/crypto/bio/bss_acpt.c b/crypto/bio/bss_acpt.c index eba6e25714..c549c87c3c 100644 --- a/crypto/bio/bss_acpt.c +++ b/crypto/bio/bss_acpt.c @@ -123,7 +123,7 @@ static int acpt_new(BIO *bi) BIO_ACCEPT *ba; bi->init = 0; - bi->num = INVALID_SOCKET; + bi->num = (int)INVALID_SOCKET; bi->flags = 0; if ((ba = BIO_ACCEPT_new()) == NULL) return (0); @@ -139,7 +139,7 @@ static BIO_ACCEPT *BIO_ACCEPT_new(void) if ((ret = OPENSSL_zalloc(sizeof(*ret))) == NULL) return (NULL); - ret->accept_sock = INVALID_SOCKET; + ret->accept_sock = (int)INVALID_SOCKET; ret->bind_mode = BIO_BIND_NORMAL; return (ret); } @@ -160,11 +160,11 @@ static void acpt_close_socket(BIO *bio) BIO_ACCEPT *c; c = (BIO_ACCEPT *)bio->ptr; - if (c->accept_sock != INVALID_SOCKET) { + if (c->accept_sock != (int)INVALID_SOCKET) { shutdown(c->accept_sock, 2); closesocket(c->accept_sock); - c->accept_sock = INVALID_SOCKET; - bio->num = INVALID_SOCKET; + c->accept_sock = (int)INVALID_SOCKET; + bio->num = (int)INVALID_SOCKET; } } @@ -200,7 +200,7 @@ static int acpt_state(BIO *b, BIO_ACCEPT *c) return (-1); } s = BIO_get_accept_socket(c->param_addr, c->bind_mode); - if (s == INVALID_SOCKET) + if (s == (int)INVALID_SOCKET) return (-1); if (c->accept_nbio) { diff --git a/crypto/bio/bss_conn.c b/crypto/bio/bss_conn.c index 0733a29675..49b0f69c1a 100644 --- a/crypto/bio/bss_conn.c +++ b/crypto/bio/bss_conn.c @@ -189,7 +189,7 @@ static int conn_state(BIO *b, BIO_CONNECT *c) c->state = BIO_CONN_S_CREATE_SOCKET; ret = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - if (ret == INVALID_SOCKET) { + if (ret == (int)INVALID_SOCKET) { SYSerr(SYS_F_SOCKET, get_last_socket_error()); ERR_add_error_data(4, "host=", c->param_hostname, ":", c->param_port); @@ -313,7 +313,7 @@ BIO_METHOD *BIO_s_connect(void) static int conn_new(BIO *bi) { bi->init = 0; - bi->num = INVALID_SOCKET; + bi->num = (int)INVALID_SOCKET; bi->flags = 0; if ((bi->ptr = (char *)BIO_CONNECT_new()) == NULL) return (0); @@ -326,12 +326,12 @@ static void conn_close_socket(BIO *bio) BIO_CONNECT *c; c = (BIO_CONNECT *)bio->ptr; - if (bio->num != INVALID_SOCKET) { + if (bio->num != (int)INVALID_SOCKET) { /* Only do a shutdown if things were established */ if (c->state == BIO_CONN_S_OK) shutdown(bio->num, 2); closesocket(bio->num); - bio->num = INVALID_SOCKET; + bio->num = (int)INVALID_SOCKET; } } diff --git a/e_os.h b/e_os.h index 8c4223bc53..6aa0f73ed0 100644 --- a/e_os.h +++ b/e_os.h @@ -477,7 +477,9 @@ struct servent *PASCAL getservbyname(const char *, const char *); /* * Even though sizeof(SOCKET) is 8, it's safe to cast it to int, because * the value constitutes an index in per-process table of limited size - * and not a real pointer. + * and not a real pointer. And we also depend on fact that all processors + * Windows run on happen to be two's-complement, which allows to + * interchange INVALID_SOCKET and -1. */ # define socket(d,t,p) ((int)socket(d,t,p)) # define accept(s,f,l) ((int)accept(s,f,l)) -- 2.40.0