@@ -54,11 +54,6 @@
}
-#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 @@
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 @@
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 @@
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 @@
gc_free(&gc);
return ret;
}
-
-#if defined(__GNUC__) || defined(__clang__)
-#pragma GCC diagnostic pop
-#endif
@@ -849,6 +849,10 @@
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 @@
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 @@
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 @@
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 @@
}
}
+#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)
{
@@ -291,9 +291,38 @@
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 */
@@ -93,8 +93,7 @@
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 @@
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 @@
{
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 @@
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()");