aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Eggert2017-05-14 18:44:36 -0700
committerPaul Eggert2017-05-14 18:48:59 -0700
commitd23a486ba27405acfda67a4dc387ade5e399a29b (patch)
tree6e7a2dc2d896e78194d049c4a54eae832a3b0040 /src
parente6f64df9c2b443d3385c2c25c29ccd5283d37e3f (diff)
downloademacs-d23a486ba27405acfda67a4dc387ade5e399a29b.tar.gz
emacs-d23a486ba27405acfda67a4dc387ade5e399a29b.zip
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
Diffstat (limited to 'src')
-rw-r--r--src/process.c28
1 files 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,
3420#ifdef HAVE_GETSOCKNAME 3420#ifdef HAVE_GETSOCKNAME
3421 if (p->port == 0) 3421 if (p->port == 0)
3422 { 3422 {
3423 struct sockaddr_in sa1; 3423 struct sockaddr_storage sa1;
3424 socklen_t len1 = sizeof (sa1); 3424 socklen_t len1 = sizeof (sa1);
3425 if (getsockname (s, (struct sockaddr *)&sa1, &len1) == 0) 3425 if (getsockname (s, (struct sockaddr *)&sa1, &len1) == 0)
3426 { 3426 {
3427 Lisp_Object service;
3428 service = make_number (ntohs (sa1.sin_port));
3429 contact = Fplist_put (contact, QCservice, service);
3430 /* Save the port number so that we can stash it in 3427 /* Save the port number so that we can stash it in
3431 the process object later. */ 3428 the process object later. */
3432 ((struct sockaddr_in *)sa)->sin_port = sa1.sin_port; 3429 int port = -1;
3430 switch (family)
3431 {
3432 case AF_INET:
3433 ((struct sockaddr_in *) sa)->sin_port
3434 = port = ((struct sockaddr_in *) &sa1)->sin_port;
3435 break;
3436# ifdef AF_INET6
3437 case AF_INET6:
3438 ((struct sockaddr_in6 *) sa)->sin6_port
3439 = port = ((struct sockaddr_in6 *) &sa1)->sin6_port;
3440 break;
3441# endif
3442 }
3443
3444 if (0 <= port)
3445 {
3446 Lisp_Object service = make_number (ntohs (port));
3447 contact = Fplist_put (contact, QCservice, service);
3448 }
3433 } 3449 }
3434 } 3450 }
3435#endif 3451#endif
@@ -3535,7 +3551,7 @@ connect_network_socket (Lisp_Object proc, Lisp_Object addrinfos,
3535#ifdef HAVE_GETSOCKNAME 3551#ifdef HAVE_GETSOCKNAME
3536 if (!p->is_server) 3552 if (!p->is_server)
3537 { 3553 {
3538 struct sockaddr_in sa1; 3554 struct sockaddr_storage sa1;
3539 socklen_t len1 = sizeof (sa1); 3555 socklen_t len1 = sizeof (sa1);
3540 if (getsockname (s, (struct sockaddr *)&sa1, &len1) == 0) 3556 if (getsockname (s, (struct sockaddr *)&sa1, &len1) == 0)
3541 contact = Fplist_put (contact, QClocal, 3557 contact = Fplist_put (contact, QClocal,