From 0f7c332f9f36f792a7903760b2a8db45091ed8b6 Mon Sep 17 00:00:00 2001 From: Marc Hoersken Date: Mon, 3 Aug 2020 15:54:08 +0200 Subject: [PATCH] select.h: make socket validation macros test for INVALID_SOCKET With Winsock the valid range is [0..INVALID_SOCKET-1] according to https://docs.microsoft.com/en-us/windows/win32/winsock/socket-data-type-2 Reviewed-by: Jay Satiro Reviewed-by: Marcel Raad Reviewed-by: Daniel Stenberg Closes #5760 --- lib/select.h | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/select.h b/lib/select.h index 95181f467e..c9cc5c2e81 100644 --- a/lib/select.h +++ b/lib/select.h @@ -94,12 +94,23 @@ int tpf_select_libcurl(int maxfds, fd_set* reads, fd_set* writes, fd_set* excepts, struct timeval *tv); #endif -/* Winsock and TPF sockets are not in range [0..FD_SETSIZE-1], which +/* TPF sockets are not in range [0..FD_SETSIZE-1], which unfortunately makes it impossible for us to easily check if they're valid + + With Winsock the valid range is [0..INVALID_SOCKET-1] according to + https://docs.microsoft.com/en-us/windows/win32/winsock/socket-data-type-2 */ -#if defined(USE_WINSOCK) || defined(TPF) +#if defined(TPF) #define VALID_SOCK(x) 1 #define VERIFY_SOCK(x) Curl_nop_stmt +#elif defined(USE_WINSOCK) +#define VALID_SOCK(s) ((s) < INVALID_SOCKET) +#define VERIFY_SOCK(x) do { \ + if(!VALID_SOCK(x)) { \ + SET_SOCKERRNO(WSAEINVAL); \ + return -1; \ + } \ +} while(0) #else #define VALID_SOCK(s) (((s) >= 0) && ((s) < FD_SETSIZE)) #define VERIFY_SOCK(x) do { \