gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] [libmicrohttpd] branch master updated (1c9fd1b9 -> 1855c73c


From: gnunet
Subject: [GNUnet-SVN] [libmicrohttpd] branch master updated (1c9fd1b9 -> 1855c73c)
Date: Mon, 13 Mar 2017 21:49:07 +0100

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

karlson2k pushed a change to branch master
in repository libmicrohttpd.

    from 1c9fd1b9 Fixed non-portable changes in 
91548850d961783a8f5b288c69ce83ecb89d3ddc Fixed waiting for empty fd_sets in 
test_empty_response.c and test_https_get_select.c
     new 8dadd66d struct MHD_UpgradeResponseHandle: clarified comments
     new 1855c73c Corrected monitor 'upgraded' sockets for errors, corrected 
handling of error and streamlined forwarding processing logic. Added some 
comments.

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 src/microhttpd/daemon.c      | 309 ++++++++++++++++++++++++++-----------------
 src/microhttpd/internal.h    |  16 ++-
 src/microhttpd/mhd_sockets.h |   4 +
 3 files changed, 207 insertions(+), 122 deletions(-)

diff --git a/src/microhttpd/daemon.c b/src/microhttpd/daemon.c
index bc10c795..b89c3d57 100644
--- a/src/microhttpd/daemon.c
+++ b/src/microhttpd/daemon.c
@@ -698,6 +698,8 @@ urh_to_fdset (struct MHD_UpgradeResponseHandle *urh,
   const MHD_socket mhd_sckt = urh->mhd.socket;
   bool res = true;
 
+  /* Do not add to 'es' only if socket is closed
+   * or not used anymore. */
   if (MHD_INVALID_SOCKET != conn_sckt)
     {
       if ( (urh->in_buffer_used < urh->in_buffer_size) &&
@@ -712,7 +714,12 @@ urh_to_fdset (struct MHD_UpgradeResponseHandle *urh,
                                   max_fd,
                                   fd_setsize)) )
         res = false;
-      if (0 != urh->in_buffer_size)
+      /* Do not monitor again for errors if error was detected before as
+       * error state is remembered. */
+      if ((0 == urh->app.celi & MHD_EPOLL_STATE_ERROR) &&
+          ((0 != urh->in_buffer_size) ||
+           (0 != urh->out_buffer_size) ||
+           (0 != urh->out_buffer_used)))
         MHD_add_to_fd_set_ (conn_sckt,
                             es,
                             max_fd,
@@ -732,7 +739,12 @@ urh_to_fdset (struct MHD_UpgradeResponseHandle *urh,
                                   max_fd,
                                   fd_setsize)) )
         res = false;
-      if (0 != urh->out_buffer_size)
+      /* Do not monitor again for errors if error was detected before as
+       * error state is remembered. */
+      if ((0 == urh->mhd.celi & MHD_EPOLL_STATE_ERROR) &&
+          ((0 != urh->out_buffer_size) ||
+           (0 != urh->in_buffer_size) ||
+           (0 != urh->in_buffer_used)))
         MHD_add_to_fd_set_ (mhd_sckt,
                             es,
                             max_fd,
@@ -761,8 +773,9 @@ urh_from_fdset (struct MHD_UpgradeResponseHandle *urh,
   const MHD_socket conn_sckt = urh->connection->socket_fd;
   const MHD_socket mhd_sckt = urh->mhd.socket;
 
-  urh->app.celi = MHD_EPOLL_STATE_UNREADY;
-  urh->mhd.celi = MHD_EPOLL_STATE_UNREADY;
+  /* Reset read/write ready, preserve error state. */
+  urh->app.celi &= (~MHD_EPOLL_STATE_READ_READY && 
~MHD_EPOLL_STATE_WRITE_READY);
+  urh->mhd.celi &= (~MHD_EPOLL_STATE_READ_READY && 
~MHD_EPOLL_STATE_WRITE_READY);
 
   if (MHD_INVALID_SOCKET != conn_sckt)
     {
@@ -799,17 +812,31 @@ urh_update_pollfd(struct MHD_UpgradeResponseHandle *urh,
 {
   p[0].events = 0;
   p[1].events = 0;
+
   if (urh->in_buffer_used < urh->in_buffer_size)
-    p[0].events |= POLLIN | MHD_POLL_EVENTS_ERR_DISC;
+    p[0].events |= POLLIN;
   if (0 != urh->out_buffer_used)
-    p[0].events |= POLLOUT | MHD_POLL_EVENTS_ERR_DISC;
-  if (0 != urh->in_buffer_size)
+    p[0].events |= POLLOUT;
+
+  /* Do not monitor again for errors if error was detected before as
+   * error state is remembered. */
+  if ((0 == urh->app.celi & MHD_EPOLL_STATE_ERROR) &&
+      ((0 != urh->in_buffer_size) ||
+       (0 != urh->out_buffer_size) ||
+       (0 != urh->out_buffer_used)))
     p[0].events |= MHD_POLL_EVENTS_ERR_DISC;
+
   if (urh->out_buffer_used < urh->out_buffer_size)
-    p[1].events |= POLLIN | MHD_POLL_EVENTS_ERR_DISC;
+    p[1].events |= POLLIN;
   if (0 != urh->in_buffer_used)
-    p[1].events |= POLLOUT | MHD_POLL_EVENTS_ERR_DISC;
-  if (0 != urh->out_buffer_size)
+    p[1].events |= POLLOUT;
+
+  /* Do not monitor again for errors if error was detected before as
+   * error state is remembered. */
+  if ((0 == urh->mhd.celi & MHD_EPOLL_STATE_ERROR) &&
+      ((0 != urh->out_buffer_size) ||
+       (0 != urh->in_buffer_size) ||
+       (0 != urh->in_buffer_used)))
     p[1].events |= MHD_POLL_EVENTS_ERR_DISC;
 }
 
@@ -839,18 +866,26 @@ static void
 urh_from_pollfd(struct MHD_UpgradeResponseHandle *urh,
                 struct pollfd p[2])
 {
+  /* Reset read/write ready, preserve error state. */
+  urh->app.celi &= (~MHD_EPOLL_STATE_READ_READY && 
~MHD_EPOLL_STATE_WRITE_READY);
+  urh->mhd.celi &= (~MHD_EPOLL_STATE_READ_READY && 
~MHD_EPOLL_STATE_WRITE_READY);
+
   if (0 != (p[0].revents & POLLIN))
     urh->app.celi |= MHD_EPOLL_STATE_READ_READY;
   if (0 != (p[0].revents & POLLOUT))
     urh->app.celi |= MHD_EPOLL_STATE_WRITE_READY;
-  if (0 != (p[0].revents & MHD_POLL_REVENTS_ERR_DISC))
+  if (0 != (p[0].revents & POLLHUP))
+    urh->app.celi |= MHD_EPOLL_STATE_READ_READY | MHD_EPOLL_STATE_WRITE_READY;
+  if (0 != (p[0].revents & MHD_POLL_REVENTS_ERRROR))
     urh->app.celi |= MHD_EPOLL_STATE_ERROR;
   if (0 != (p[1].revents & POLLIN))
     urh->mhd.celi |= MHD_EPOLL_STATE_READ_READY;
   if (0 != (p[1].revents & POLLOUT))
     urh->mhd.celi |= MHD_EPOLL_STATE_WRITE_READY;
-  if (0 != (p[1].revents & MHD_POLL_REVENTS_ERR_DISC))
+  if (0 != (p[1].revents & POLLHUP))
     urh->mhd.celi |= MHD_EPOLL_STATE_ERROR;
+  if (0 != (p[1].revents & MHD_POLL_REVENTS_ERRROR))
+    urh->mhd.celi |= MHD_EPOLL_STATE_READ_READY | MHD_EPOLL_STATE_WRITE_READY;
 }
 #endif /* HTTPS_SUPPORT && UPGRADE_SUPPORT */
 
@@ -1165,6 +1200,8 @@ process_urh (struct MHD_UpgradeResponseHandle *urh)
    * each time. */
   struct MHD_Connection * const connection = urh->connection;
   struct MHD_Daemon * const daemon = connection->daemon;
+  /* Prevent data races. */
+  bool was_closed;
   if (daemon->shutdown)
     {
       /* Daemon shutting down, application will not receive any more data. */
@@ -1177,7 +1214,8 @@ process_urh (struct MHD_UpgradeResponseHandle *urh)
 #endif
       urh->was_closed = true;
     }
-  if (urh->was_closed)
+  was_closed = urh->was_closed;
+  if (was_closed)
     {
       /* Application was closed connections: no more data
        * can be forwarded to application socket. */
@@ -1191,6 +1229,13 @@ process_urh (struct MHD_UpgradeResponseHandle *urh)
 #endif
 
         }
+      /* If application signaled MHD about socket closure then
+       * check for any pending data even if socket is not marked
+       * as 'ready' (signal may arrive after poll()/select()).
+       * Socketpair for forwarding is always in non-blocking mode
+       * so no risk that recv() will block the thread. */
+      if (0 != urh->out_buffer_size)
+        urh->mhd.celi |= MHD_EPOLL_STATE_READ_READY;
       /* Discard any data received form remote. */
       urh->in_buffer_used = 0;
       /* Do not try to push data to application. */
@@ -1201,13 +1246,19 @@ process_urh (struct MHD_UpgradeResponseHandle *urh)
       connection->tls_read_ready = false;
     }
 
-  /* Some platforms (W32, possibly Darwin) may discard data in system buffers
-   * received by system but unread by recv() if remote side was disconnected
-   * and failed send() attempted (send() will always fail after remote 
disconnect
-   * was detected).
+  /* On some platforms (W32, possibly Darwin) failed send() (send() will always
+   * fail after remote disconnect was detected) may discard data in system
+   * buffers received by system but not yet read by recv().
    * So, before trying send() on any socket, recv() must be performed at first
    * otherwise last part of incoming data may be lost. */
 
+  /* If disconnect or error was detected - try to read from socket
+   * to dry data possibly pending is system buffers. */
+  if (0 != (MHD_EPOLL_STATE_ERROR & urh->app.celi))
+    urh->app.celi |= MHD_EPOLL_STATE_READ_READY;
+  if (0 != (MHD_EPOLL_STATE_ERROR & urh->mhd.celi))
+    urh->mhd.celi |= MHD_EPOLL_STATE_READ_READY;
+
   /*
    * handle reading from remote TLS client
    */
@@ -1226,9 +1277,7 @@ process_urh (struct MHD_UpgradeResponseHandle *urh)
       res = gnutls_record_recv (connection->tls_session,
                                 &urh->in_buffer[urh->in_buffer_used],
                                 buf_size);
-      if (GNUTLS_E_AGAIN == res)
-        urh->app.celi &= ~MHD_EPOLL_STATE_READ_READY;
-      else if (res > 0)
+      if (0 < res)
         {
           urh->in_buffer_used += res;
           if (buf_size > (size_t)res)
@@ -1236,26 +1285,34 @@ process_urh (struct MHD_UpgradeResponseHandle *urh)
           else if (0 < gnutls_record_check_pending (connection->tls_session))
             connection->tls_read_ready = true;
         }
-      else if ( (0 >= res ) &&
-                (GNUTLS_E_INTERRUPTED != res) )
+      else /* 0 >= res */
         {
-          /* Connection was shut down or got unrecoverable error.
-           * Reading from remote client is not required anymore. */
+          if (GNUTLS_E_INTERRUPTED != res)
+            {
+              urh->app.celi &= ~MHD_EPOLL_STATE_READ_READY;
+              if (GNUTLS_E_AGAIN != res)
+                {
+                  /* Unrecoverable error on socket was detected or
+                   * socket was disconnected/shut down. */
+                  /* Stop trying to read from this TLS socket. */
+                  urh->in_buffer_size = 0;
+                }
+            }
+        }
+      if (MHD_EPOLL_STATE_ERROR ==
+          ((MHD_EPOLL_STATE_ERROR | MHD_EPOLL_STATE_READ_READY) & 
urh->app.celi))
+        {
+          /* Unrecoverable error on socket was detected and all
+           * pending data was read from system buffers. */
+          /* Stop trying to read from this TLS socket. */
           urh->in_buffer_size = 0;
-          urh->app.celi &= ~MHD_EPOLL_STATE_READ_READY;
         }
     }
 
   /*
    * handle reading from application
    */
-  /* If application signaled MHD about socket closure then
-   * check for any pending data even if socket is not marked
-   * as 'ready' (signal may arrive after poll()/select()).
-   * Socketpair for forwarding is always in non-blocking mode
-   * so no risk that recv() will block the thread. */
-  if ( ( (0 != (MHD_EPOLL_STATE_READ_READY & urh->mhd.celi)) ||
-         (urh->was_closed) ) &&
+  if ( (0 != (MHD_EPOLL_STATE_READ_READY & urh->mhd.celi)) &&
        (urh->out_buffer_used < urh->out_buffer_size) )
     {
       ssize_t res;
@@ -1268,44 +1325,41 @@ process_urh (struct MHD_UpgradeResponseHandle *urh)
       res = MHD_recv_ (urh->mhd.socket,
                        &urh->out_buffer[urh->out_buffer_used],
                        buf_size);
-      if (0 > res)
+      if (0 < res)
+        {
+          urh->out_buffer_used += res;
+          if (buf_size > (size_t)res)
+            urh->mhd.celi &= ~MHD_EPOLL_STATE_READ_READY;
+        }
+      else /* 0 >= res */
         {
-          if (urh->was_closed)
+          const int err = MHD_socket_get_error_ ();
+          if ((0 == res) ||
+              ((! MHD_SCKT_ERR_IS_EINTR_ (err)) &&
+               (! MHD_SCKT_ERR_IS_LOW_RESOURCES_(err))))
             {
-              /* All data was received and application will not
-               * forward any more data. */
-              /* Do not try to pull data from application. */
-              urh->out_buffer_size = 0;
               urh->mhd.celi &= ~MHD_EPOLL_STATE_READ_READY;
-            }
-          else
-            {
-              const int err = MHD_socket_get_error_ ();
-              if (MHD_SCKT_ERR_IS_EAGAIN_ (err))
-                urh->mhd.celi &= ~MHD_EPOLL_STATE_READ_READY;
-              else if ( (! MHD_SCKT_ERR_IS_EINTR_ (err)) &&
-                        (! MHD_SCKT_ERR_IS_LOW_RESOURCES_(err)) )
+              if ((0 == res) ||
+                  (was_closed) ||
+                  (0 != (MHD_EPOLL_STATE_ERROR & urh->mhd.celi)) ||
+                  (! MHD_SCKT_ERR_IS_EAGAIN_ (err)))
                 {
-                  /* persistent / unrecoverable error, treat as
-                     if connection was shut down */
-                  /* Do not try to pull data from application. */
+                  /* Socket disconnect/shutdown was detected;
+                   * Application signaled about closure of 'upgraded' socket;
+                   * or persistent / unrecoverable error. */
+                  /* Do not try to pull more data from application. */
                   urh->out_buffer_size = 0;
-                  urh->mhd.celi &= ~MHD_EPOLL_STATE_READ_READY;
                 }
             }
         }
-      else
-        {
-          urh->out_buffer_used += res;
-          if (buf_size > (size_t)res)
-            urh->mhd.celi &= ~MHD_EPOLL_STATE_READ_READY;
-        }
-      if (0 == res)
+      if ( (0 == (MHD_EPOLL_STATE_READ_READY & urh->mhd.celi)) &&
+           ( (0 != (MHD_EPOLL_STATE_ERROR & urh->mhd.celi)) ||
+             (was_closed) ) )
         {
-          /* Connection was shut down or got unrecoverable error.
-             Do not try to pull data from application. */
+          /* Unrecoverable error on socket was detected and all
+           * pending data was read from system buffers. */
+          /* Do not try to pull more data from application. */
           urh->out_buffer_size = 0;
-          urh->mhd.celi &= ~MHD_EPOLL_STATE_READ_READY;
         }
     }
 
@@ -1325,40 +1379,49 @@ process_urh (struct MHD_UpgradeResponseHandle *urh)
       res = gnutls_record_send (connection->tls_session,
                                 urh->out_buffer,
                                 data_size);
-      if (GNUTLS_E_AGAIN == res)
+      if (0 < res)
         {
-          urh->app.celi &= ~MHD_EPOLL_STATE_WRITE_READY;
-        }
-      else if (res > 0)
-        {
-          if (urh->out_buffer_used != res)
+          const size_t next_out_buffer_used = urh->out_buffer_used - res;
+          if (0 != next_out_buffer_used)
             {
               memmove (urh->out_buffer,
                        &urh->out_buffer[res],
-                       urh->out_buffer_used - res);
-              urh->out_buffer_used -= res;
+                       next_out_buffer_used);
               if (data_size > (size_t)res)
                 urh->app.celi &= ~MHD_EPOLL_STATE_WRITE_READY;
             }
-          else
+          urh->out_buffer_used = next_out_buffer_used;
+        }
+      else /* 0 >= res */
+        {
+          if (GNUTLS_E_INTERRUPTED != res)
             {
-              urh->out_buffer_used = 0;
+              urh->app.celi &= ~MHD_EPOLL_STATE_WRITE_READY;
+              if (GNUTLS_E_INTERRUPTED != res)
+                {
+                  /* TLS connection shut down or
+                   * persistent / unrecoverable error. */
+#ifdef HAVE_MESSAGES
+                  MHD_DLOG (daemon,
+                            _("Failed to forward to remote client " 
MHD_UNSIGNED_LONG_LONG_PRINTF \
+                                " bytes of data received from application: 
%s\n"),
+                            (MHD_UNSIGNED_LONG_LONG) urh->out_buffer_used,
+                            gnutls_strerror(res));
+#endif
+                  /* Discard any data unsent to remote. */
+                  urh->out_buffer_used = 0;
+                  /* Do not try to pull more data from application. */
+                  urh->out_buffer_size = 0;
+                  urh->mhd.celi &= ~MHD_EPOLL_STATE_READ_READY;
+                }
             }
         }
-      else if (GNUTLS_E_INTERRUPTED != res)
+      if ( (0 == urh->out_buffer_used) &&
+           (0 != (MHD_EPOLL_STATE_ERROR & urh->app.celi)) )
         {
-          /* persistent / unrecoverable error, treat as
-             if connection was shut down. */
-#ifdef HAVE_MESSAGES
-          MHD_DLOG (daemon,
-                    _("Failed to forward to remote client " 
MHD_UNSIGNED_LONG_LONG_PRINTF \
-                        " bytes of data received from application: %s\n"),
-                    (MHD_UNSIGNED_LONG_LONG) urh->out_buffer_used,
-                    gnutls_strerror(res));
-#endif
-          /* Discard any data unsent to remote. */
-          urh->out_buffer_used = 0;
-          /* Do not try to sent to remote anymore. */
+          /* Unrecoverable error on socket was detected and all
+           * pending data was sent to remote. */
+          /* Do not try to send to remote anymore. */
           urh->app.celi &= ~MHD_EPOLL_STATE_WRITE_READY;
           /* Do not try to pull more data from application. */
           urh->out_buffer_size = 0;
@@ -1370,7 +1433,7 @@ process_urh (struct MHD_UpgradeResponseHandle *urh)
    * handle writing to application
    */
   if ( (0 != (MHD_EPOLL_STATE_WRITE_READY & urh->mhd.celi)) &&
-       (urh->in_buffer_used > 0) )
+         (urh->in_buffer_used > 0) )
     {
       ssize_t res;
       size_t data_size;
@@ -1382,50 +1445,56 @@ process_urh (struct MHD_UpgradeResponseHandle *urh)
       res = MHD_send_ (urh->mhd.socket,
                        urh->in_buffer,
                        data_size);
-      if (0 > res)
+      if (0 < res)
         {
-          int err = MHD_socket_get_error_ ();
-
-          if (MHD_SCKT_ERR_IS_EAGAIN_ (err))
-            urh->mhd.celi &= ~MHD_EPOLL_STATE_WRITE_READY;
-          else if ( (! MHD_SCKT_ERR_IS_EINTR_ (err)) &&
-                    (! MHD_SCKT_ERR_IS_LOW_RESOURCES_(err)) )
-            {
-              /* persistent / unrecoverable error, treat as
-                 if connection was shut down. */
-#ifdef HAVE_MESSAGES
-              MHD_DLOG (daemon,
-                        _("Failed to forward to application " 
MHD_UNSIGNED_LONG_LONG_PRINTF \
-                            " bytes of data received from remote side: %s\n"),
-                        (MHD_UNSIGNED_LONG_LONG) urh->in_buffer_used,
-                        MHD_socket_strerr_ (err));
-#endif
-              /* Discard any data received form remote. */
-              urh->in_buffer_used = 0;
-              /* Do not try to push data to application. */
-              urh->mhd.celi &= ~MHD_EPOLL_STATE_WRITE_READY;
-              /* Reading from remote client is not required anymore. */
-              urh->in_buffer_size = 0;
-              urh->app.celi &= ~MHD_EPOLL_STATE_READ_READY;
-              connection->tls_read_ready = false;
-            }
-        }
-      else
-        {
-          if (urh->in_buffer_used != res)
+          const size_t next_in_buffer_used = urh->in_buffer_used - res;
+          if (0 != next_in_buffer_used)
             {
               memmove (urh->in_buffer,
                        &urh->in_buffer[res],
-                       urh->in_buffer_used - res);
-              urh->in_buffer_used -= res;
+                       next_in_buffer_used);
               if (data_size > (size_t)res)
                 urh->mhd.celi &= ~MHD_EPOLL_STATE_WRITE_READY;
             }
-          else
+          urh->in_buffer_used = next_in_buffer_used;
+        }
+      else /* 0 >= res */
+        {
+          const int err = MHD_socket_get_error_ ();
+          if ( (! MHD_SCKT_ERR_IS_EINTR_ (err)) &&
+               (! MHD_SCKT_ERR_IS_LOW_RESOURCES_(err)) )
             {
-              urh->in_buffer_used = 0;
+              urh->mhd.celi &= ~MHD_EPOLL_STATE_WRITE_READY;
+              if (! MHD_SCKT_ERR_IS_EAGAIN_ (err))
+                {
+                  /* Socketpair connection shut down or
+                   * persistent / unrecoverable error. */
+#ifdef HAVE_MESSAGES
+                  MHD_DLOG (daemon,
+                            _("Failed to forward to application " 
MHD_UNSIGNED_LONG_LONG_PRINTF \
+                                " bytes of data received from remote side: 
%s\n"),
+                            (MHD_UNSIGNED_LONG_LONG) urh->in_buffer_used,
+                            MHD_socket_strerr_ (err));
+#endif
+                  /* Discard any data received form remote. */
+                  urh->in_buffer_used = 0;
+                  /* Reading from remote client is not required anymore. */
+                  urh->in_buffer_size = 0;
+                  urh->app.celi &= ~MHD_EPOLL_STATE_READ_READY;
+                  connection->tls_read_ready = false;
+                }
             }
         }
+      if ( (0 !=urh->in_buffer_used) &&
+           (0 != (MHD_EPOLL_STATE_ERROR & urh->mhd.celi)) )
+        {
+          /* Do not try to push data to application. */
+          urh->mhd.celi &= ~MHD_EPOLL_STATE_WRITE_READY;
+          /* Reading from remote client is not required anymore. */
+          urh->in_buffer_size = 0;
+          urh->app.celi &= ~MHD_EPOLL_STATE_READ_READY;
+          connection->tls_read_ready = false;
+        }
     }
 
   /* Check whether data is present in TLS buffers
@@ -3835,6 +3904,10 @@ run_epoll_for_upgrade (struct MHD_Daemon *daemon)
             ueh->celi |= MHD_EPOLL_STATE_READ_READY;
           if (0 != (events[i].events & EPOLLOUT))
             ueh->celi |= MHD_EPOLL_STATE_WRITE_READY;
+          if (0 != (events[i].events & EPOLLHUP))
+            ueh->celi |= MHD_EPOLL_STATE_READ_READY | 
MHD_EPOLL_STATE_WRITE_READY;
+          if (0 != (events[i].events & (EPOLLERR | EPOLLPRI)))
+            ueh->celi |= MHD_EPOLL_STATE_ERROR;
 
           process_urh (urh);
           /* Finished forwarding? */
diff --git a/src/microhttpd/internal.h b/src/microhttpd/internal.h
index efe3fbb8..62c60a31 100644
--- a/src/microhttpd/internal.h
+++ b/src/microhttpd/internal.h
@@ -1048,26 +1048,34 @@ struct MHD_UpgradeResponseHandle
   char *out_buffer;
 
   /**
-   * Size of the @e in_buffer. 0 if the connection went down for reading.
+   * Size of the @e in_buffer.
+   * Set to 0 if the TLS connection went down for reading or socketpair
+   * went down for writing.
    */
   size_t in_buffer_size;
 
   /**
-   * Size of the @e out_buffer. 0 if the connection went down for writing.
+   * Size of the @e out_buffer.
+   * Set to 0 if the TLS connection went down for writing or socketpair
+   * went down for reading.
    */
   size_t out_buffer_size;
 
   /**
    * Number of bytes actually in use in the @e in_buffer.  Can be larger
    * than @e in_buffer_size if and only if @a in_buffer_size is zero and
-   * we still have bytes to process in the buffer.
+   * we still have bytes that can be forwarded.
+   * Reset to zero if all data was forwarded to socketpair or
+   * if socketpair went down for writing.
    */
   size_t in_buffer_used;
 
   /**
    * Number of bytes actually in use in the @e out_buffer. Can be larger
    * than @e out_buffer_size if and only if @a out_buffer_size is zero and
-   * we still have bytes to process in the buffer.
+   * we still have bytes that can be forwarded.
+   * Reset to zero if all data was forwarded to TLS connection or
+   * if TLS connection went down for writing.
    */
   size_t out_buffer_used;
 
diff --git a/src/microhttpd/mhd_sockets.h b/src/microhttpd/mhd_sockets.h
index 6b3261c3..3ebe0dc1 100644
--- a/src/microhttpd/mhd_sockets.h
+++ b/src/microhttpd/mhd_sockets.h
@@ -369,6 +369,10 @@
  * Note: Out-of-band data is treated as error. */
 #  define MHD_POLL_REVENTS_ERR_DISC \
      (MHD_POLLPRI_OR_ZERO | MHD_POLLRDBAND_OR_ZERO | MHD_POLLNVAL_OR_ZERO | 
POLLERR | POLLHUP)
+/* MHD_POLL_REVENTS_ERRROR is 'revents' mask for errors.
+ * Note: Out-of-band data is treated as error. */
+#  define MHD_POLL_REVENTS_ERRROR \
+     (MHD_POLLPRI_OR_ZERO | MHD_POLLRDBAND_OR_ZERO | MHD_POLLNVAL_OR_ZERO | 
POLLERR)
 #endif /* HAVE_POLL */
 
 #define MHD_SCKT_MISSING_ERR_CODE_ 31450

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



reply via email to

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