From 960e402c14db43130e6054d0fe6a4d0af71b4acf Mon Sep 17 00:00:00 2001 From: "Erik M. Bray" Date: Fri, 3 Nov 2017 15:33:17 +0100 Subject: [PATCH] Fix two bugs in the limit of large numbers of sockets: * Fix the maximum number of sockets allowed in the session to 2048, instead of making it relative to sizeof(wsa_event). * Return an error and set errno=ENOBUF if a socket can't be created due to this limit being reached. --- winsup/cygwin/fhandler_socket.cc | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc index 7a6dbdc..b8eda57 100644 --- a/winsup/cygwin/fhandler_socket.cc +++ b/winsup/cygwin/fhandler_socket.cc @@ -496,7 +496,7 @@ fhandler_socket::af_local_set_secret (char *buf) /* Maximum number of concurrently opened sockets from all Cygwin processes per session. Note that shared sockets (through dup/fork/exec) are counted as one socket. */ -#define NUM_SOCKS (32768 / sizeof (wsa_event)) +#define NUM_SOCKS ((unsigned int) 2048) #define LOCK_EVENTS \ if (wsock_mtx && \ @@ -623,7 +623,14 @@ fhandler_socket::init_events () NtClose (wsock_mtx); return false; } - wsock_events = search_wsa_event_slot (new_serial_number); + if (!(wsock_events = search_wsa_event_slot (new_serial_number))); + { + set_errno (ENOBUFS); + NtClose (wsock_evt); + NtClose (wsock_mtx); + return false; + } + /* sock type not yet set here. */ if (pc.dev == FH_UDP || pc.dev == FH_DGRAM) wsock_events->events = FD_WRITE; -- 2.8.3