This is the mail archive of the cygwin-cvs@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[newlib-cygwin] Fix two bugs in the limit of large numbers of sockets:


https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=1c50e0d1abd5cc790e72572af6fd6b03f7d1c594

commit 1c50e0d1abd5cc790e72572af6fd6b03f7d1c594
Author: Erik M. Bray <erik.m.bray@gmail.com>
Date:   Tue Nov 7 14:44:49 2017 +0100

    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).
    
      The original choice of 2048 was in order to fit the wsa_events array
      in the .cygwin_dll_common shared section, but there is still enough
      room to grow there to have 2048 sockets on 64-bit as well.
    
    * Return an error and set errno=ENOBUF if a socket can't be created
      due to this limit being reached.
    
    Signed-off-by: Corinna Vinschen <corinna@vinschen.de>

Diff:
---
 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..185fd51 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       2048U
 
 #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;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]