From mboxrd@z Thu Jan 1 00:00:00 1970
Path: news.gmane.org!.POSTED!not-for-mail
From: Philipp Stephani
Newsgroups: gmane.emacs.devel
Subject: [PATCH] Fix use of sockaddr_in
Date: Sat, 13 May 2017 17:08:37 +0200
Message-ID: <20170513150837.31184-1-phst@google.com>
References: <83shk989r5.fsf@gnu.org>
NNTP-Posting-Host: blaine.gmane.org
X-Trace: blaine.gmane.org 1494688171 27510 195.159.176.226 (13 May 2017 15:09:31 GMT)
X-Complaints-To: usenet@blaine.gmane.org
NNTP-Posting-Date: Sat, 13 May 2017 15:09:31 +0000 (UTC)
Cc: Philipp Stephani
To: emacs-devel@gnu.org
Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sat May 13 17:09:27 2017
Return-path:
Envelope-to: ged-emacs-devel@m.gmane.org
Original-Received: from lists.gnu.org ([208.118.235.17])
by blaine.gmane.org with esmtp (Exim 4.84_2)
(envelope-from )
id 1d9Yfe-00074b-Ti
for ged-emacs-devel@m.gmane.org; Sat, 13 May 2017 17:09:27 +0200
Original-Received: from localhost ([::1]:57903 helo=lists.gnu.org)
by lists.gnu.org with esmtp (Exim 4.71)
(envelope-from )
id 1d9Yfk-0005Uf-Jw
for ged-emacs-devel@m.gmane.org; Sat, 13 May 2017 11:09:32 -0400
Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:59728)
by lists.gnu.org with esmtp (Exim 4.71)
(envelope-from ) id 1d9Yf1-0005U5-OV
for emacs-devel@gnu.org; Sat, 13 May 2017 11:08:50 -0400
Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)
(envelope-from ) id 1d9Yey-0003Ud-AJ
for emacs-devel@gnu.org; Sat, 13 May 2017 11:08:47 -0400
Original-Received: from mail-wr0-x243.google.com ([2a00:1450:400c:c0c::243]:36765)
by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16)
(Exim 4.71) (envelope-from )
id 1d9Yey-0003T7-2O
for emacs-devel@gnu.org; Sat, 13 May 2017 11:08:44 -0400
Original-Received: by mail-wr0-x243.google.com with SMTP id v42so10083690wrc.3
for ; Sat, 13 May 2017 08:08:44 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025;
h=from:to:cc:subject:date:message-id:in-reply-to:references;
bh=cqTsqDggKc1YOXIwT5GsM/4BG++W/L5QMld0J98749E=;
b=YVuuuv/bDTPwmr11sICTXVYsjdlWCocFkh/p6qYR9VbJ05J3M8je2dF0NpgImAjyaa
Jwft3GGuZb08JTI/lU33JBLNt3/cE3WvBLsFAf0aWpDfCO8u2kPtVDQTfNCLYT+32/GI
UF5NNeCi7Qt4QCwUsZ1eI37wRVh2tZKGmByVQO9pB5tG9EHCBoUhPdmUdOWHW2v7tLvR
ERnoeOmhHzfK1Guza6fnbgEPbRgGaSzAshjKe3tfb+QRXr/05RxzoJ2aWN2iW4OKWLEZ
Pu/rCLstsn254fcPalMM5gWflScFmMULCe4lW3kojHFx00SrJOso74/LjebhAYiujDfl
eESg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=1e100.net; s=20161025;
h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to
:references;
bh=cqTsqDggKc1YOXIwT5GsM/4BG++W/L5QMld0J98749E=;
b=LzuvV3jwqP8p+oFbYyZl2BHnFqdGv2+WPZHZ7in9TfUTi+u5fJ6I7IBCukBSNPzKGR
jtAtBQyT7yGavJnkne+KT1flPjdAZWN3C6sbDIV26800MoBzpDWAbyreOvvCaK80NDCD
nESvGgCCqZXdKjOmfhoZPA80pdZk2siJPjzHZuN7fVt+G7ZepLVT08mwsr13RDuY2Y3C
ZMcmMJno0VTe5qnGYNaaXT3Vlf4BQROS175aPOmoKoehbzdnHwkBWb/sppaPcJ2VXbVj
byo3gaM2PD2XDYvZLvTGyTQ9mDPzP02NhNIT8Phz2zS2uV/Azrmupi+TUDB9b8Af2a+f
SHCQ==
X-Gm-Message-State: AODbwcAg1m/NWrYEKXtcmQ1+6imbnpG4SB1xv+AeXVJBsEXEJ52/NHl7
XsERoieoHE6s6HXc6OQ=
X-Received: by 10.223.160.219 with SMTP id n27mr6251924wrn.201.1494688122757;
Sat, 13 May 2017 08:08:42 -0700 (PDT)
Original-Received: from p.cm.cablesurf.de (46.128.198.151.dynamic.cablesurf.de.
[46.128.198.151])
by smtp.gmail.com with ESMTPSA id l45sm4954906wre.2.2017.05.13.08.08.41
(version=TLS1 cipher=AES128-SHA bits=128/128);
Sat, 13 May 2017 08:08:41 -0700 (PDT)
X-Google-Original-From: Philipp Stephani
X-Mailer: git-send-email 2.13.0
In-Reply-To: <83shk989r5.fsf@gnu.org>
X-detected-operating-system: by eggs.gnu.org: Genre and OS details not
recognized.
X-Received-From: 2a00:1450:400c:c0c::243
X-BeenThere: emacs-devel@gnu.org
X-Mailman-Version: 2.1.21
Precedence: list
List-Id: "Emacs development discussions."
List-Unsubscribe: ,
List-Archive:
List-Post:
List-Help:
List-Subscribe: ,
Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org
Original-Sender: "Emacs-devel"
Xref: news.gmane.org gmane.emacs.devel:214822
Archived-At:
Fixes an access violation detected by AddressSanitizer.
* process.c (connect_network_socket): Use sockaddr_storage
structure instead of sockaddr_in. Only sockaddr_storage is
guaranteed to be large enough for all address families.
---
src/process.c | 42 ++++++++++++++++++++++++++++++++----------
1 file changed, 32 insertions(+), 10 deletions(-)
diff --git a/src/process.c b/src/process.c
index 0edd092ef6..873db48b55 100644
--- a/src/process.c
+++ b/src/process.c
@@ -3420,16 +3420,35 @@ 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;
+ eassert (sizeof sa1 >= len1);
+ in_port_t port;
+ bool has_port;
+ switch (sa1.ss_family)
+ {
+ case AF_INET:
+ port = ((struct sockaddr_in6 *) (struct sockaddr *) &sa1)->sin6_port;
+ has_port = true;
+ break;
+ case AF_INET6:
+ port = ((struct sockaddr_in *) (struct sockaddr *) &sa1)->sin_port;
+ has_port = true;
+ break;
+ default:
+ has_port = false;
+ break;
+ }
+ if (has_port)
+ {
+ const Lisp_Object service = make_number (ntohs (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 = port;
+ }
}
}
#endif
@@ -3535,11 +3554,14 @@ 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,
- conv_sockaddr_to_lisp ((struct sockaddr *)&sa1, len1));
+ {
+ eassert (sizeof sa1 >= len1);
+ contact = Fplist_put (contact, QClocal,
+ conv_sockaddr_to_lisp ((struct sockaddr *)&sa1, len1));
+ }
}
#endif
}
--
2.13.0