gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] [libmicrohttpd] branch master updated: fix warning 'Failed


From: gnunet
Subject: [GNUnet-SVN] [libmicrohttpd] branch master updated: fix warning 'Failed to get listen port number due to small buffer' encountered when we try to derive the port of a unix domain socket
Date: Mon, 27 Nov 2017 23:01:41 +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 db6a2374 fix warning 'Failed to get listen port number due to small 
buffer' encountered when we try to derive the port of a unix domain socket
db6a2374 is described below

commit db6a2374adc1d5feb250b8c31f0649df64e2e920
Author: Christian Grothoff <address@hidden>
AuthorDate: Mon Nov 27 23:01:39 2017 +0100

    fix warning 'Failed to get listen port number due to small buffer' 
encountered when we try to derive the port of a unix domain socket
---
 ChangeLog               |  5 +++
 src/microhttpd/daemon.c | 98 +++++++++++++++++++++++--------------------------
 2 files changed, 50 insertions(+), 53 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 8950170b..eab669d6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Mon Nov 27 22:58:38 CET 2017
+       Tolerate AF_UNIX when trying to determine our binding port
+       from socket.  Use `sockaddr_storage` instead of trying to
+       guess the sockaddr type before calling getsockname(). -CG
+
 Mon Nov 27 22:24:00 MSK 2017
        Releasing GNU libmicrohttpd 0.9.57. -EG
 
diff --git a/src/microhttpd/daemon.c b/src/microhttpd/daemon.c
index abe40e72..cf27a885 100644
--- a/src/microhttpd/daemon.c
+++ b/src/microhttpd/daemon.c
@@ -5764,74 +5764,66 @@ MHD_start_daemon_va (unsigned int flags,
   if ( (0 == daemon->port) &&
        (0 == (*pflags & MHD_USE_NO_LISTEN_SOCKET)) )
     { /* Get port number. */
-      struct sockaddr *realaddr;
-#ifdef MHD_POSIX_SOCKETS
-      socklen_t alloc_len;
-#endif /* MHD_POSIX_SOCKETS */
-#ifdef HAVE_INET6
-      if (0 != (*pflags & MHD_USE_IPv6))
-        {
-          memset (&servaddr6,
-                  0,
-                  sizeof (struct sockaddr_in6));
-          servaddr6.sin6_family = AF_INET6;
-#ifdef HAVE_SOCKADDR_IN_SIN_LEN
-          servaddr6.sin6_len = sizeof (struct sockaddr_in6);
-#endif /* HAVE_SOCKADDR_IN_SIN_LEN */
-          addrlen = (socklen_t) sizeof (struct sockaddr_in6);
-          realaddr = (struct sockaddr *) &servaddr6;
-        }
-      else
-#else  /* ! HAVE_INET6 */
-      if (1)
-#endif /* ! HAVE_INET6 */
-        {
-          memset (&servaddr4,
-                  0,
-                  sizeof (struct sockaddr_in));
-          servaddr4.sin_family = AF_INET;
-#ifdef HAVE_SOCKADDR_IN_SIN_LEN
-          servaddr4.sin_len = sizeof (struct sockaddr_in);
-#endif /* HAVE_SOCKADDR_IN_SIN_LEN */
-          addrlen = (socklen_t) sizeof (struct sockaddr_in);
-          realaddr = (struct sockaddr *) &servaddr4;
-        }
-#ifdef MHD_POSIX_SOCKETS
-      alloc_len = addrlen;
-#endif /* MHD_POSIX_SOCKETS */
-      if (0 != getsockname (listen_fd, realaddr, &addrlen))
-        {
+      struct sockaddr_storage servaddr;
+
+      memset (&servaddr,
+              0,
+              sizeof (struct sockaddr_storage));
+      addrlen = sizeof (servaddr);
+      if (0 != getsockname (listen_fd,
+                            (struct sockaddr *) &servaddr,
+                            &addrlen))
+      {
 #ifdef HAVE_MESSAGES
-      MHD_DLOG (daemon,
-                _("Failed to get listen port number: %s\n"),
-                MHD_socket_last_strerr_ ());
+        MHD_DLOG (daemon,
+                  _("Failed to get listen port number: %s\n"),
+                  MHD_socket_last_strerr_ ());
 #endif /* HAVE_MESSAGES */
         }
 #ifdef MHD_POSIX_SOCKETS
-      else if (alloc_len < addrlen)
+      else if (sizeof (servaddr) < addrlen)
         {
+          /* should be impossible with `struct sockaddr_storage` */
 #ifdef HAVE_MESSAGES
-      MHD_DLOG (daemon,
-                _("Failed to get listen port number due to small buffer\n"));
+          MHD_DLOG (daemon,
+                    _("Failed to get listen port number (`struct 
sockaddr_storage` too small!?)\n"));
 #endif /* HAVE_MESSAGES */
         }
 #endif /* MHD_POSIX_SOCKETS */
       else
         {
-#ifdef HAVE_INET6
-          if (0 != (*pflags & MHD_USE_IPv6))
+          switch (servaddr.ss_family)
+          {
+          case AF_INET:
             {
-              mhd_assert (AF_INET6 == servaddr6.sin6_family);
-              daemon->port = ntohs(servaddr6.sin6_port);
+              struct sockaddr_in *s4 = (struct sockaddr_in *) &servaddr;
+
+              daemon->port = ntohs (s4->sin_port);
+              break;
             }
-          else
-#else  /* ! HAVE_INET6 */
-          if (1)
-#endif /* ! HAVE_INET6 */
+#ifdef HAVE_INET6
+          case AF_INET6:
             {
-              mhd_assert (AF_INET == servaddr4.sin_family);
-              daemon->port = ntohs(servaddr4.sin_port);
+              struct sockaddr_in6 *s6 = (struct sockaddr_in6 *) &servaddr;
+
+              daemon->port = ntohs(s6->sin6_port);
+              mhd_assert (0 != (*pflags & MHD_USE_IPv6));
+              break;
             }
+#endif /* HAVE_INET6 */
+#ifdef AF_UNIX
+          case AF_UNIX:
+            daemon->port = 0; /* special value for UNIX domain sockets */
+            break;
+#endif
+          default:
+#ifdef HAVE_MESSAGES
+            MHD_DLOG (daemon,
+                      _("Unknown address family!\n"));
+#endif
+            daemon->port = 0; /* ugh */
+            break;
+          }
         }
     }
 

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



reply via email to

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