From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: mituharu@math.s.chiba-u.ac.jp Newsgroups: gmane.emacs.bugs Subject: bug#32604: 26.1.50; memory leak in connect_network_socket Date: Mon, 3 Sep 2018 15:02:00 +0900 Message-ID: <0aad35d46cfe7a15d67484205d19340c.squirrel@weber.math.s.chiba-u.ac.jp> References: <87k1o3rdgd.fsf@gmail.com> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: text/plain;charset=iso-2022-jp Content-Transfer-Encoding: 7bit X-Trace: blaine.gmane.org 1535954471 14815 195.159.176.226 (3 Sep 2018 06:01:11 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Mon, 3 Sep 2018 06:01:11 +0000 (UTC) User-Agent: SquirrelMail/1.4.22-5.el6 Cc: 32604@debbugs.gnu.org To: "Noam Postavsky" Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Mon Sep 03 08:01:07 2018 Return-path: Envelope-to: geb-bug-gnu-emacs@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 1fwhv7-0003fB-T7 for geb-bug-gnu-emacs@m.gmane.org; Mon, 03 Sep 2018 08:01:06 +0200 Original-Received: from localhost ([::1]:43631 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fwhxD-0006hl-V3 for geb-bug-gnu-emacs@m.gmane.org; Mon, 03 Sep 2018 02:03:15 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:42181) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fwhx5-0006hL-Vd for bug-gnu-emacs@gnu.org; Mon, 03 Sep 2018 02:03:08 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fwhx0-000134-Rh for bug-gnu-emacs@gnu.org; Mon, 03 Sep 2018 02:03:07 -0400 Original-Received: from debbugs.gnu.org ([208.118.235.43]:38509) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fwhx0-00012w-Ku for bug-gnu-emacs@gnu.org; Mon, 03 Sep 2018 02:03:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1fwhx0-00068N-GP for bug-gnu-emacs@gnu.org; Mon, 03 Sep 2018 02:03:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: mituharu@math.s.chiba-u.ac.jp Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 03 Sep 2018 06:03:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 32604 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 32604-submit@debbugs.gnu.org id=B32604.153595452623458 (code B ref 32604); Mon, 03 Sep 2018 06:03:02 +0000 Original-Received: (at 32604) by debbugs.gnu.org; 3 Sep 2018 06:02:06 +0000 Original-Received: from localhost ([127.0.0.1]:43521 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fwhw5-00066I-W0 for submit@debbugs.gnu.org; Mon, 03 Sep 2018 02:02:06 -0400 Original-Received: from mathmail.math.s.chiba-u.ac.jp ([133.82.132.2]:57659) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1fwhw3-00065o-LH for 32604@debbugs.gnu.org; Mon, 03 Sep 2018 02:02:04 -0400 Original-Received: from weber.math.s.chiba-u.ac.jp (weber [192.168.32.4]) by mathmail.math.s.chiba-u.ac.jp (Postfix) with ESMTP id 3264AF08FA; Mon, 3 Sep 2018 15:02:00 +0900 (JST) (envelope-from mituharu@math.s.chiba-u.ac.jp) Original-Received: from 150.100.253.38 (SquirrelMail authenticated user mituharu) by weber.math.s.chiba-u.ac.jp with HTTP; Mon, 3 Sep 2018 15:02:00 +0900 In-Reply-To: <87k1o3rdgd.fsf@gmail.com> X-Priority: 3 (Normal) Importance: Normal X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 208.118.235.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.org gmane.emacs.bugs:149983 Archived-At: > YAMAMOTO Mitsuharu writes: > >> In connect_network_socket (in process.c), the memory pointed to >> by the variable `sa’ doesn’t seem to be deallocated. >> >> 3328 struct sockaddr *sa = NULL; >> : >> 3347 while (!NILP (addrinfos)) >> 3348 { >> : >> 3359 if (sa) >> 3360free (sa); >> 3361 sa = xmalloc (addrlen); >> : >> 3533 } >> : >> >> The following patch would fix the leak: > >> + xfree (sa); > > I think we would need > > record_unwind_protect_ptr (xfree, sa); > > to handle the case where an error is signaled. Similar to how the > socket closing is handled: > > /* Make us close S if quit. */ > record_unwind_protect_int (close_file_unwind, s); > Indeed. Could someone double-check the patch below? YAMAMOTO Mitsuharu mituharu@math.s.chiba-u.ac.jp diff --git a/src/process.c b/src/process.c index 676f38446e..ff53b86844 100644 --- a/src/process.c +++ b/src/process.c @@ -3322,6 +3322,7 @@ connect_network_socket (Lisp_Object proc, Lisp_Object addrinfos, Lisp_Object use_external_socket_p) { ptrdiff_t count = SPECPDL_INDEX (); + ptrdiff_t count1 UNINIT; int s = -1, outch, inch; int xerrno = 0; int family; @@ -3344,6 +3345,9 @@ connect_network_socket (Lisp_Object proc, Lisp_Object addrinfos, /* Do this in case we never enter the while-loop below. */ s = -1; + record_unwind_protect_nothing (); + count1 = SPECPDL_INDEX (); + while (!NILP (addrinfos)) { Lisp_Object addrinfo = XCAR (addrinfos); @@ -3356,9 +3360,8 @@ connect_network_socket (Lisp_Object proc, Lisp_Object addrinfos, #endif addrlen = get_lisp_to_sockaddr_size (ip_address, &family); - if (sa) - free (sa); - sa = xmalloc (addrlen); + sa = xrealloc (sa, addrlen); + set_unwind_protect_ptr (count, xfree, sa); conv_lisp_to_sockaddr (family, ip_address, sa, addrlen); s = socket_to_use; @@ -3520,7 +3523,7 @@ connect_network_socket (Lisp_Object proc, Lisp_Object addrinfos, #endif /* !WINDOWSNT */ /* Discard the unwind protect closing S. */ - specpdl_ptr = specpdl + count; + specpdl_ptr = specpdl + count1; emacs_close (s); s = -1; if (0 <= socket_to_use) @@ -3591,6 +3594,7 @@ connect_network_socket (Lisp_Object proc, Lisp_Object addrinfos, Lisp_Object data = get_file_errno_data (err, contact, xerrno); pset_status (p, list2 (Fcar (data), Fcdr (data))); + unbind_to (count, Qnil); return; } @@ -3610,7 +3614,7 @@ connect_network_socket (Lisp_Object proc, Lisp_Object addrinfos, p->outfd = outch; /* Discard the unwind protect for closing S, if any. */ - specpdl_ptr = specpdl + count; + specpdl_ptr = specpdl + count1; if (p->is_server && p->socktype != SOCK_DGRAM) pset_status (p, Qlisten); @@ -3671,6 +3675,7 @@ connect_network_socket (Lisp_Object proc, Lisp_Object addrinfos, } #endif + unbind_to (count, Qnil); } /* Create a network stream/datagram client/server process. Treated