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