From 42459e22c9ccf3488609338c9e4e4a9bd845e602 Mon Sep 17 00:00:00 2001 From: Frank Lichtenheld Date: Thu, 16 Oct 2025 12:17:16 +0200 Subject: [PATCH] socket: Wrap winsock functions to avoid common conversion warnings Before I had done those at the call site but we have several very similar issues with multiple occurrences. So handle them together. Change-Id: If91d14f31368a93182bcf23b1d82b06ea94381d8 Signed-off-by: Frank Lichtenheld Acked-by: Gert Doering Gerrit URL: https://gerrit.openvpn.net/c/openvpn/+/1277 Message-Id: <20251016101722.2979-1-gert@greenie.muc.de> URL: https://sourceforge.net/p/openvpn/mailman/message/59247452/ Signed-off-by: Gert Doering --- src/openvpn/proxy.c | 15 +++------------ src/openvpn/socket.c | 15 ++++++++++++--- src/openvpn/socket.h | 29 +++++++++++++++++++++++++++++ src/openvpn/socks.c | 17 +++++++---------- 4 files changed, 51 insertions(+), 25 deletions(-) diff --git a/src/openvpn/proxy.c b/src/openvpn/proxy.c index 02554ba17..dfe1e590f 100644 --- a/src/openvpn/proxy.c +++ b/src/openvpn/proxy.c @@ -54,11 +54,6 @@ init_http_proxy_options_once(struct http_proxy_options **hpo, struct gc_arena *g } -#if defined(__GNUC__) || defined(__clang__) -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wconversion" -#endif - /* cached proxy username/password */ static struct user_pass static_proxy_user_pass; @@ -93,7 +88,7 @@ recv_line(socket_descriptor_t sd, char *buf, int len, const int timeout_sec, con tv.tv_sec = timeout_sec; tv.tv_usec = 0; - status = select(sd + 1, &reads, NULL, NULL, &tv); + status = openvpn_select(sd + 1, &reads, NULL, NULL, &tv); get_signal(signal_received); if (*signal_received) @@ -192,7 +187,7 @@ error: static bool send_line(socket_descriptor_t sd, const char *buf) { - const ssize_t size = send(sd, buf, strlen(buf), MSG_NOSIGNAL); + const ssize_t size = openvpn_send(sd, buf, strlen(buf), MSG_NOSIGNAL); if (size != (ssize_t)strlen(buf)) { msg(D_LINK_ERRORS | M_ERRNO, "send_line: TCP port write failed on send()"); @@ -903,7 +898,7 @@ establish_http_proxy_passthru(struct http_proxy_info *p, if (opaque) { - const int len = strlen(opaque) + 16; + const size_t len = strlen(opaque) + 16; opaque_kv = gc_malloc(len, false, &gc); snprintf(opaque_kv, len, ", opaque=\"%s\"", opaque); } @@ -1068,7 +1063,3 @@ error: gc_free(&gc); return ret; } - -#if defined(__GNUC__) || defined(__clang__) -#pragma GCC diagnostic pop -#endif diff --git a/src/openvpn/socket.c b/src/openvpn/socket.c index f71d891e7..40a86fbb6 100644 --- a/src/openvpn/socket.c +++ b/src/openvpn/socket.c @@ -849,6 +849,10 @@ tcp_connection_established(const struct link_socket_actual *act) gc_free(&gc); } +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic pop +#endif + static socket_descriptor_t socket_listen_accept(socket_descriptor_t sd, struct link_socket_actual *act, const char *remote_dynamic, const struct addrinfo *local, bool do_listen, @@ -873,7 +877,7 @@ socket_listen_accept(socket_descriptor_t sd, struct link_socket_actual *act, tv.tv_sec = 0; tv.tv_usec = 0; - status = select(sd + 1, &reads, NULL, NULL, &tv); + status = openvpn_select(sd + 1, &reads, NULL, NULL, &tv); get_signal(signal_received); if (*signal_received) @@ -979,7 +983,7 @@ socket_bind(socket_descriptor_t sd, struct addrinfo *local, int ai_family, const msg(M_NONFATAL | M_ERRNO, "Setting IPV6_V6ONLY=%d failed", v6only); } } - if (bind(sd, cur->ai_addr, cur->ai_addrlen)) + if (openvpn_bind(sd, cur->ai_addr, cur->ai_addrlen)) { msg(M_FATAL | M_ERRNO, "%s: Socket bind failed on local address %s", prefix, print_sockaddr_ex(local->ai_addr, ":", PS_SHOW_PORT, &gc)); @@ -1026,7 +1030,7 @@ openvpn_connect(socket_descriptor_t sd, const struct sockaddr *remote, int conne tv.tv_sec = (connect_timeout > 0) ? 1 : 0; tv.tv_usec = 0; - status = select(sd + 1, NULL, &writes, NULL, &tv); + status = openvpn_select(sd + 1, NULL, &writes, NULL, &tv); #endif if (signal_received) { @@ -1183,6 +1187,11 @@ socket_frame_init(const struct frame *frame, struct link_socket *sock) } } +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + static void resolve_bind_local(struct link_socket *sock, const sa_family_t af) { diff --git a/src/openvpn/socket.h b/src/openvpn/socket.h index 2c79a1164..e986c9cf7 100644 --- a/src/openvpn/socket.h +++ b/src/openvpn/socket.h @@ -291,9 +291,38 @@ SocketHandleSetInvalError(sockethandle_t sh) sh.is_handle ? SetLastError(ERROR_INVALID_FUNCTION) : WSASetLastError(WSAEINVAL); } +/* winsock(2).h uses slightly different types so to avoid conversion + errors we wrap these functions on Windows */ + +static inline int +openvpn_select(socket_descriptor_t nfds, fd_set *readfds, fd_set *writefds, + fd_set *exceptfds, struct timeval *timeout) +{ + (void)nfds; /* first argument ignored on Windows */ + return select(0, readfds, writefds, exceptfds, timeout); +} + +static inline ssize_t +openvpn_send(socket_descriptor_t sockfd, const void *buf, size_t len, int flags) +{ + ASSERT(len <= INT_MAX); + return send(sockfd, buf, (int)len, flags); +} + +static inline int +openvpn_bind(socket_descriptor_t sockfd, const struct sockaddr *addr, size_t addrlen) +{ + ASSERT(addrlen <= INT_MAX); + return bind(sockfd, addr, (int)addrlen); +} + #else /* ifdef _WIN32 */ #define openvpn_close_socket(s) close(s) +#define openvpn_select(nfds, readfds, writefds, exceptfds, timeout) \ + select(nfds, readfds, writefds, exceptfds, timeout) +#define openvpn_send(sockfd, buf, len, flags) send(sockfd, buf, len, flags) +#define openvpn_bind(sockfd, addr, addrlen) bind(sockfd, addr, addrlen) #endif /* ifdef _WIN32 */ diff --git a/src/openvpn/socks.c b/src/openvpn/socks.c index 6467baf28..d383ef7b8 100644 --- a/src/openvpn/socks.c +++ b/src/openvpn/socks.c @@ -93,8 +93,7 @@ socks_proxy_recv_char(char *c, const char *name, socket_descriptor_t sd, tv.tv_sec = get_server_poll_remaining_time(server_poll_timeout); tv.tv_usec = 0; - /* NB: first argument ignored on Windows where socket_descriptor_t != int */ - const int status = select((int)sd + 1, &reads, NULL, NULL, &tv); + const int status = openvpn_select(sd + 1, &reads, NULL, NULL, &tv); get_signal(signal_received); if (*signal_received) @@ -156,10 +155,9 @@ socks_username_password_auth(struct socks_proxy_info *p, socket_descriptor_t sd, creds.username, (int)strlen(creds.password), creds.password); ASSERT(sret >= 0 && sret <= sizeof(to_send)); - /* NB: int because Windows APIs */ - ssize_t size = send(sd, to_send, (int)strlen(to_send), MSG_NOSIGNAL); + ssize_t size = openvpn_send(sd, to_send, strlen(to_send), MSG_NOSIGNAL); - if (size != strlen(to_send)) + if (size != (ssize_t)strlen(to_send)) { msg(D_LINK_ERRORS | M_ERRNO, "socks_username_password_auth: TCP port write failed on send()"); @@ -208,7 +206,7 @@ socks_handshake(struct socks_proxy_info *p, socket_descriptor_t sd, { method_sel[2] = 0x02; /* METHODS = [2 (plain login)] */ } - size = send(sd, method_sel, sizeof(method_sel), MSG_NOSIGNAL); + size = openvpn_send(sd, method_sel, sizeof(method_sel), MSG_NOSIGNAL); if (size != sizeof(method_sel)) { msg(D_LINK_ERRORS | M_ERRNO, "socks_handshake: TCP port write failed on send()"); @@ -415,10 +413,9 @@ establish_socks_proxy_passthru(struct socks_proxy_info *p, buf[5 + len + 1] = (char)(port & 0xff); { - /* int because Windows APIs */ - int send_len = 5 + (int)len + 2; - const ssize_t size = send(sd, buf, send_len, MSG_NOSIGNAL); - if (size != send_len) + size_t send_len = 5 + len + 2; + const ssize_t size = openvpn_send(sd, buf, send_len, MSG_NOSIGNAL); + if (size != (ssize_t)send_len) { msg(D_LINK_ERRORS | M_ERRNO, "establish_socks_proxy_passthru: TCP port write failed on send()"); -- 2.47.3