]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix address violation found by AddressSanitizer
authorPaul Eggert <eggert@cs.ucla.edu>
Mon, 15 May 2017 01:44:36 +0000 (18:44 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Mon, 15 May 2017 01:48:59 +0000 (18:48 -0700)
* src/process.c (connect_network_socket):
Use struct sockaddr_storage, not struct sockaddr_in, to store info
about a socket address.  Problem reported by Philipp Stephani in:
http://lists.gnu.org/archive/html/emacs-devel/2017-05/msg00314.html
This fix is based on a patch by Philipp in:
http://lists.gnu.org/archive/html/emacs-devel/2017-05/msg00357.html

src/process.c

index 0edd092ef665c3224ac76fe6bd7b78917339ccc9..4a286391f8899b6d8cde72ef0ff9f5213c2b6cae 100644 (file)
@@ -3420,16 +3420,32 @@ connect_network_socket (Lisp_Object proc, Lisp_Object addrinfos,
 #ifdef HAVE_GETSOCKNAME
          if (p->port == 0)
            {
-             struct sockaddr_in sa1;
+             struct sockaddr_storage sa1;
              socklen_t len1 = sizeof (sa1);
              if (getsockname (s, (struct sockaddr *)&sa1, &len1) == 0)
                {
-                 Lisp_Object service;
-                 service = make_number (ntohs (sa1.sin_port));
-                 contact = Fplist_put (contact, QCservice, service);
                  /* Save the port number so that we can stash it in
                     the process object later.  */
-                 ((struct sockaddr_in *)sa)->sin_port = sa1.sin_port;
+                 int port = -1;
+                 switch (family)
+                   {
+                   case AF_INET:
+                     ((struct sockaddr_in *) sa)->sin_port
+                       = port = ((struct sockaddr_in *) &sa1)->sin_port;
+                     break;
+# ifdef AF_INET6
+                   case AF_INET6:
+                     ((struct sockaddr_in6 *) sa)->sin6_port
+                       = port = ((struct sockaddr_in6 *) &sa1)->sin6_port;
+                     break;
+# endif
+                   }
+
+                 if (0 <= port)
+                   {
+                     Lisp_Object service = make_number (ntohs (port));
+                     contact = Fplist_put (contact, QCservice, service);
+                   }
                }
            }
 #endif
@@ -3535,7 +3551,7 @@ connect_network_socket (Lisp_Object proc, Lisp_Object addrinfos,
 #ifdef HAVE_GETSOCKNAME
       if (!p->is_server)
        {
-         struct sockaddr_in sa1;
+         struct sockaddr_storage sa1;
          socklen_t len1 = sizeof (sa1);
          if (getsockname (s, (struct sockaddr *)&sa1, &len1) == 0)
            contact = Fplist_put (contact, QClocal,