This is the mail archive of the cygwin-patches 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]

Re: [PATCH] Fix two bugs in the limit of large numbers of sockets:


On 07/11/2017 13:44, Erik M. Bray wrote:
* 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.
---
  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)));

This has a stray ';' at the end of the line

../../../../winsup/cygwin/fhandler_socket.cc: In member function 'bool fhandler_socket::init_events()': ../../../../winsup/cygwin/fhandler_socket.cc:626:3: error: this 'if' clause does not guard... [-Werror=misleading-indentation]
   if (!(wsock_events = search_wsa_event_slot (new_serial_number)));
   ^~
../../../../winsup/cygwin/fhandler_socket.cc:627:5: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the 'if'
     {
     ^

+    {
+      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;


How did you test this?


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