]> sourceware.org Git - newlib-cygwin.git/commitdiff
Fix two bugs in the limit of large numbers of sockets:
authorErik M. Bray <erik.m.bray@gmail.com>
Tue, 7 Nov 2017 13:44:49 +0000 (14:44 +0100)
committerCorinna Vinschen <corinna@vinschen.de>
Tue, 7 Nov 2017 15:08:14 +0000 (16:08 +0100)
* 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>
winsup/cygwin/fhandler_socket.cc

index 7a6dbdc41a41c248967f624f7e9385d0ba2346ca..185fd51ff977e5fb3f7abe70af1b14805907e49d 100644 (file)
@@ -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;
This page took 0.031164 seconds and 5 git commands to generate.