gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] [libmicrohttpd] branch master updated: found another race,


From: gnunet
Subject: [GNUnet-SVN] [libmicrohttpd] branch master updated: found another race, just with partial work-around for now; also init errno in all cases
Date: Tue, 14 Feb 2017 18:38:17 +0100

This is an automated email from the git hooks/post-receive script.

grothoff pushed a commit to branch master
in repository libmicrohttpd.

The following commit(s) were added to refs/heads/master by this push:
     new 81456703 found another race, just with partial work-around for now; 
also init errno in all cases
81456703 is described below

commit 8145670329c735a028146e6d5232b34a10adc256
Author: Christian Grothoff <address@hidden>
AuthorDate: Tue Feb 14 18:39:10 2017 +0100

    found another race, just with partial work-around for now; also init errno 
in all cases
---
 src/microhttpd/daemon.c                  | 49 +++++++++++++++++++-------------
 src/testcurl/test_get_response_cleanup.c | 10 +++++--
 src/testcurl/test_quiesce_stream.c       |  4 +--
 3 files changed, 40 insertions(+), 23 deletions(-)

diff --git a/src/microhttpd/daemon.c b/src/microhttpd/daemon.c
index bc26b53f..a8997d87 100644
--- a/src/microhttpd/daemon.c
+++ b/src/microhttpd/daemon.c
@@ -775,6 +775,7 @@ MHD_get_fdset2 (struct MHD_Daemon *daemon,
   struct MHD_Connection *pos;
   struct MHD_Connection *posn;
   int result = MHD_YES;
+  MHD_socket ls;
 
   if ( (NULL == daemon) ||
        (NULL == read_fd_set) ||
@@ -795,8 +796,9 @@ MHD_get_fdset2 (struct MHD_Daemon *daemon,
                                  fd_setsize) ? MHD_YES : MHD_NO;
     }
 #endif
-  if ( (MHD_INVALID_SOCKET != daemon->socket_fd) &&
-       (! MHD_add_to_fd_set_ (daemon->socket_fd,
+  ls = daemon->socket_fd;
+  if ( (MHD_INVALID_SOCKET != ls) &&
+       (! MHD_add_to_fd_set_ (ls,
                               read_fd_set,
                               max_fd,
                               fd_setsize)) )
@@ -2222,6 +2224,7 @@ internal_add_connection (struct MHD_Daemon *daemon,
          gnutls_certificate_server_set_request (connection->tls_session,
                                                 GNUTLS_CERT_REQUEST);
 #else  /* ! HTTPS_SUPPORT */
+      eno = EINVAL;
       goto cleanup;
 #endif /* ! HTTPS_SUPPORT */
     }
@@ -2688,7 +2691,7 @@ MHD_accept_connection (struct MHD_Daemon *daemon)
       /* This could be a common occurance with multiple worker threads */
       if ( (MHD_SCKT_ERR_IS_ (err,
                               MHD_SCKT_EINVAL_)) &&
-           (MHD_INVALID_SOCKET == daemon->socket_fd) )
+           (MHD_INVALID_SOCKET == fd) )
         return MHD_NO; /* can happen during shutdown */
       if (MHD_SCKT_ERR_IS_DISCNN_BEFORE_ACCEPT_(err))
         return MHD_NO; /* do not print error if client just disconnected early 
*/
@@ -3105,6 +3108,7 @@ MHD_select (struct MHD_Daemon *daemon,
   struct timeval *tv;
   MHD_UNSIGNED_LONG_LONG ltimeout;
   int err_state;
+  MHD_socket ls;
 
   timeout.tv_sec = 0;
   timeout.tv_usec = 0;
@@ -3140,8 +3144,8 @@ MHD_select (struct MHD_Daemon *daemon,
   else
     {
       /* accept only, have one thread per connection */
-      if ( (MHD_INVALID_SOCKET != daemon->socket_fd) &&
-           (! MHD_add_to_fd_set_ (daemon->socket_fd,
+      if ( (MHD_INVALID_SOCKET != (ls = daemon->socket_fd)) &&
+           (! MHD_add_to_fd_set_ (ls,
                                   &rs,
                                   &maxsock,
                                   FD_SETSIZE)) )
@@ -3163,9 +3167,9 @@ MHD_select (struct MHD_Daemon *daemon,
       /* fdset limit reached, new connections
          cannot be handled. Remove listen socket FD
          from fdset and retry to add ITC FD. */
-      if (MHD_INVALID_SOCKET != daemon->socket_fd)
+      if (MHD_INVALID_SOCKET != (ls = daemon->socket_fd))
         {
-          FD_CLR (daemon->socket_fd,
+          FD_CLR (ls,
                   &rs);
           if (! MHD_add_to_fd_set_ (MHD_itc_r_fd_(daemon->itc),
                                     &rs,
@@ -3189,13 +3193,13 @@ MHD_select (struct MHD_Daemon *daemon,
      the shutdown OR the termination of an existing connection; so
      only do this optimization if we have a signaling ITC in
      place. */
-  if ( (MHD_INVALID_SOCKET != daemon->socket_fd) &&
+  if ( (MHD_INVALID_SOCKET != (ls = daemon->socket_fd)) &&
        (MHD_ITC_IS_VALID_(daemon->itc)) &&
        (0 != (daemon->options & MHD_USE_ITC)) &&
        ( (daemon->connections == daemon->connection_limit) ||
          (daemon->at_limit) ) )
     {
-      FD_CLR (daemon->socket_fd,
+      FD_CLR (ls,
               &rs);
     }
   tv = NULL;
@@ -3287,6 +3291,7 @@ MHD_poll_all (struct MHD_Daemon *daemon,
     int poll_listen;
     int poll_itc_idx;
     struct pollfd *p;
+    MHD_socket ls;
 
     p = MHD_calloc_ ((2 + num_connections), sizeof (struct pollfd));
     if (NULL == p)
@@ -3300,12 +3305,12 @@ MHD_poll_all (struct MHD_Daemon *daemon,
       }
     poll_server = 0;
     poll_listen = -1;
-    if ( (MHD_INVALID_SOCKET != daemon->socket_fd) &&
+    if ( (MHD_INVALID_SOCKET != (ls = daemon->socket_fd)) &&
         (daemon->connections < daemon->connection_limit) &&
          (! daemon->at_limit) )
       {
        /* only listen if we are not at the connection limit */
-       p[poll_server].fd = daemon->socket_fd;
+       p[poll_server].fd = ls;
        p[poll_server].events = POLLIN;
        p[poll_server].revents = 0;
        poll_listen = (int) poll_server;
@@ -3503,6 +3508,7 @@ MHD_poll_listen_socket (struct MHD_Daemon *daemon,
   unsigned int poll_count;
   int poll_listen;
   int poll_itc_idx;
+  MHD_socket ls;
 
   memset (&p,
           0,
@@ -3510,9 +3516,9 @@ MHD_poll_listen_socket (struct MHD_Daemon *daemon,
   poll_count = 0;
   poll_listen = -1;
   poll_itc_idx = -1;
-  if (MHD_INVALID_SOCKET != daemon->socket_fd)
+  if (MHD_INVALID_SOCKET != (ls = daemon->socket_fd))
     {
-      p[poll_count].fd = daemon->socket_fd;
+      p[poll_count].fd = ls;
       p[poll_count].events = POLLIN;
       p[poll_count].revents = 0;
       poll_listen = poll_count;
@@ -3701,6 +3707,7 @@ MHD_epoll (struct MHD_Daemon *daemon,
   MHD_UNSIGNED_LONG_LONG timeout_ll;
   int num_events;
   unsigned int i;
+  MHD_socket ls;
 #if defined(HTTPS_SUPPORT) && defined(UPGRADE_SUPPORT)
   int run_upgraded = MHD_NO;
 #endif /* HTTPS_SUPPORT && UPGRADE_SUPPORT */
@@ -3709,7 +3716,7 @@ MHD_epoll (struct MHD_Daemon *daemon,
     return MHD_NO; /* we're down! */
   if (daemon->shutdown)
     return MHD_NO;
-  if ( (MHD_INVALID_SOCKET != daemon->socket_fd) &&
+  if ( (MHD_INVALID_SOCKET != (ls = daemon->socket_fd)) &&
        (daemon->connections < daemon->connection_limit) &&
        (MHD_NO == daemon->listen_socket_in_epoll) &&
        (! daemon->at_limit) )
@@ -3718,7 +3725,7 @@ MHD_epoll (struct MHD_Daemon *daemon,
       event.data.ptr = daemon;
       if (0 != epoll_ctl (daemon->epoll_fd,
                          EPOLL_CTL_ADD,
-                         daemon->socket_fd,
+                         ls,
                          &event))
        {
 #ifdef HAVE_MESSAGES
@@ -3759,7 +3766,7 @@ MHD_epoll (struct MHD_Daemon *daemon,
         for event loop for now */
       if (0 != epoll_ctl (daemon->epoll_fd,
                          EPOLL_CTL_DEL,
-                         daemon->socket_fd,
+                         ls,
                          NULL))
        MHD_PANIC (_("Failed to remove listen FD from epoll set\n"));
       daemon->listen_socket_in_epoll = MHD_NO;
@@ -4141,7 +4148,7 @@ MHD_start_daemon (unsigned int flags,
  * returned socket; however, if MHD is run using threads (anything but
  * external select mode), socket will be removed from existing threads
  * with some delay and it must not be closed while it's in use. To make
- * sure that socket is not used anymore, call #MHD_stop_daemon.
+ * sure that the socket is not used anymore, call #MHD_stop_daemon.
  *
  * Note that some thread modes require the caller to have passed
  * #MHD_USE_ITC when using this API.  If this daemon is
@@ -4196,6 +4203,9 @@ MHD_quiesce_daemon (struct MHD_Daemon *daemon)
               MHD_PANIC (_("Failed to signal quiesce via inter-thread 
communication channel"));
           }
       }
+  /* FIXME: This creates a race with the rest of the code.
+     We may be adding the FD to the epoll-set concurrently
+     in another thread! So we DO need to lock (yuck yuck). */
   daemon->socket_fd = MHD_INVALID_SOCKET;
 #ifdef EPOLL_SUPPORT
   if ( (0 != (daemon->options & MHD_USE_EPOLL)) &&
@@ -4698,6 +4708,7 @@ static int
 setup_epoll_to_listen (struct MHD_Daemon *daemon)
 {
   struct epoll_event event;
+  MHD_socket ls;
 
   daemon->epoll_fd = setup_epoll_fd (daemon);
   if (-1 == daemon->epoll_fd)
@@ -4710,13 +4721,13 @@ setup_epoll_to_listen (struct MHD_Daemon *daemon)
          return MHD_NO;
     }
 #endif /* HTTPS_SUPPORT && UPGRADE_SUPPORT */
-  if (MHD_INVALID_SOCKET == daemon->socket_fd)
+  if (MHD_INVALID_SOCKET == (ls = daemon->socket_fd))
     return MHD_YES; /* non-listening daemon */
   event.events = EPOLLIN;
   event.data.ptr = daemon;
   if (0 != epoll_ctl (daemon->epoll_fd,
                      EPOLL_CTL_ADD,
-                     daemon->socket_fd,
+                     ls,
                      &event))
     {
 #ifdef HAVE_MESSAGES
diff --git a/src/testcurl/test_get_response_cleanup.c 
b/src/testcurl/test_get_response_cleanup.c
index 26b2ecda..2833899c 100644
--- a/src/testcurl/test_get_response_cleanup.c
+++ b/src/testcurl/test_get_response_cleanup.c
@@ -77,6 +77,7 @@ fork_curl (const char *url)
   _exit (-1);
 }
 
+
 static void
 kill_curl (pid_t pid)
 {
@@ -97,6 +98,7 @@ push_callback (void *cls, uint64_t pos, char *buf, size_t max)
   return 1;
 }
 
+
 static void
 push_free_callback (void *cls)
 {
@@ -165,19 +167,20 @@ testInternalGet ()
   return 0;
 }
 
+
 static int
 testMultithreadedGet ()
 {
   struct MHD_Daemon *d;
   pid_t curl;
 
+  ok = 1;
   d = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION | 
MHD_USE_INTERNAL_POLLING_THREAD | MHD_USE_ERROR_LOG,
                         1081, NULL, NULL, &ahc_echo, "GET",
                        MHD_OPTION_CONNECTION_TIMEOUT, (unsigned int) 2,
                        MHD_OPTION_END);
   if (d == NULL)
     return 16;
-  ok = 1;
   //fprintf (stderr, "Forking cURL!\n");
   curl = fork_curl ("http://127.0.0.1:1081/";);
   sleep (1);
@@ -201,18 +204,19 @@ testMultithreadedGet ()
   return 0;
 }
 
+
 static int
 testMultithreadedPoolGet ()
 {
   struct MHD_Daemon *d;
   pid_t curl;
 
+  ok = 1;
   d = MHD_start_daemon (MHD_USE_INTERNAL_POLLING_THREAD | MHD_USE_ERROR_LOG,
                         1081, NULL, NULL, &ahc_echo, "GET",
                         MHD_OPTION_THREAD_POOL_SIZE, CPU_COUNT, 
MHD_OPTION_END);
   if (d == NULL)
     return 64;
-  ok = 1;
   curl = fork_curl ("http://127.0.0.1:1081/";);
   sleep (1);
   kill_curl (curl);
@@ -224,6 +228,7 @@ testMultithreadedPoolGet ()
   return 0;
 }
 
+
 static int
 testExternalGet ()
 {
@@ -236,6 +241,7 @@ testExternalGet ()
   struct timeval tv;
   pid_t curl;
 
+  ok = 1;
   d = MHD_start_daemon (MHD_USE_ERROR_LOG,
                         1082, NULL, NULL, &ahc_echo, "GET", MHD_OPTION_END);
   if (d == NULL)
diff --git a/src/testcurl/test_quiesce_stream.c 
b/src/testcurl/test_quiesce_stream.c
index 7885a048..38263e07 100644
--- a/src/testcurl/test_quiesce_stream.c
+++ b/src/testcurl/test_quiesce_stream.c
@@ -61,7 +61,7 @@ resume_connection (void *arg)
 {
   struct MHD_Connection *connection = arg;
 
-  fprintf (stderr, "Calling resume\n");
+  /* fprintf (stderr, "Calling resume\n"); */
   MHD_resume_connection (connection);
   return NULL;
 }
@@ -72,7 +72,7 @@ suspend_connection (struct MHD_Connection *connection)
 {
   pthread_t thread_id;
 
-  fprintf (stderr, "Calling suspend\n");
+  /* fprintf (stderr, "Calling suspend\n"); */
   MHD_suspend_connection (connection);
   int status = pthread_create (&thread_id,
                                NULL,

-- 
To stop receiving notification emails like this one, please contact
address@hidden



reply via email to

[Prev in Thread] Current Thread [Next in Thread]