[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] master d23a486: Fix address violation found by AddressSani
From: |
Paul Eggert |
Subject: |
[Emacs-diffs] master d23a486: Fix address violation found by AddressSanitizer |
Date: |
Sun, 14 May 2017 21:49:04 -0400 (EDT) |
branch: master
commit d23a486ba27405acfda67a4dc387ade5e399a29b
Author: Paul Eggert <address@hidden>
Commit: Paul Eggert <address@hidden>
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 0edd092..4a28639 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,
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] master d23a486: Fix address violation found by AddressSanitizer,
Paul Eggert <=