From d23a486ba27405acfda67a4dc387ade5e399a29b Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sun, 14 May 2017 18:44:36 -0700 Subject: [PATCH] Fix address violation found by AddressSanitizer * 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 | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/process.c b/src/process.c index 0edd092ef66..4a286391f88 100644 --- a/src/process.c +++ b/src/process.c @@ -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, -- 2.39.2