public inbox for libc-hacker@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] Avoid leaks in res_init
@ 2004-07-21 17:39 Jakub Jelinek
  2004-07-21 18:07 ` [PATCH] tst-leaks2 Jakub Jelinek
  2004-07-21 18:31 ` [PATCH] Avoid leaks in res_init Ulrich Drepper
  0 siblings, 2 replies; 3+ messages in thread
From: Jakub Jelinek @ 2004-07-21 17:39 UTC (permalink / raw)
  To: Ulrich Drepper; +Cc: Glibc hackers

Hi!

#include <malloc.h>
#include <resolv.h>
#include <netdb.h>

int main (void)
{
  int i;
  mtrace ();
  for (i = 0; i < 50; ++i)
    {
      res_init ();
      gethostbyname ("www.google.com");
    }
}

leaks memory and if IPv6 is enabled also filehandles.
I have googled around but could not find a word about whether
res_init can or can't be called multiple times, but certainly
we need such an interface e.g. for nscd to reread resolv.conf
during nscd -i hosts.

2004-07-21  Jakub Jelinek  <jakub@redhat.com>

	* resolv/res_libc.c (res_init): If RES_INIT is set and
	_res.nscount > 0, call __res_nclose and free nsaddrs.

--- libc/resolv/res_libc.c.jj	2003-07-23 09:56:18.000000000 +0200
+++ libc/resolv/res_libc.c	2004-07-21 19:25:05.419402346 +0200
@@ -54,6 +54,14 @@ res_init(void) {
 		_res.retry = 4;
 	if (!(_res.options & RES_INIT))
 		_res.options = RES_DEFAULT;
+	else if (_res.nscount > 0) {
+		__res_nclose (&_res);	/* Close any VC sockets.  */
+
+		for (int ns = 0; ns < MAXNS; ns++) {
+			free (_res._u._ext.nsaddrs[ns]);
+			_res._u._ext.nsaddrs[ns] = NULL;
+		}
+	}
 
 	/*
 	 * This one used to initialize implicitly to zero, so unless the app

	Jakub

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH] tst-leaks2
  2004-07-21 17:39 [PATCH] Avoid leaks in res_init Jakub Jelinek
@ 2004-07-21 18:07 ` Jakub Jelinek
  2004-07-21 18:31 ` [PATCH] Avoid leaks in res_init Ulrich Drepper
  1 sibling, 0 replies; 3+ messages in thread
From: Jakub Jelinek @ 2004-07-21 18:07 UTC (permalink / raw)
  To: Ulrich Drepper; +Cc: Glibc hackers

On Wed, Jul 21, 2004 at 05:23:24PM +0200, Jakub Jelinek wrote:
> leaks memory and if IPv6 is enabled also filehandles.

Here is a testcase for make xcheck:

2004-07-21  Jakub Jelinek  <jakub@redhat.com>

	* resolv/Makefile: Add rules to build and run tst-leaks2.
	* resolv/tst-leaks2.c: New test.

--- libc/resolv/Makefile.jj	2004-01-12 10:52:38.000000000 +0100
+++ libc/resolv/Makefile	2004-07-21 20:00:47.727921163 +0200
@@ -33,8 +33,9 @@ routines := herror inet_addr inet_ntop i
 	    res_hconf res_libc res-state
 
 tests = tst-aton tst-leaks
+xtests = tst-leaks2
 
-generate := mtrace-tst-leaks tst-leaks.mtrace
+generate := mtrace-tst-leaks tst-leaks.mtrace tst-leaks2.mtrace
 
 include ../Makeconfig
 
@@ -65,7 +66,8 @@ ifeq (yesyes,$(build-shared)$(have-threa
 tests: $(objpfx)ga_test
 endif
 
-generated := mtrace-tst-leaks tst-leaks.mtrace
+generated := mtrace-tst-leaks tst-leaks.mtrace \
+	     mtrace-tst-leaks2 tst-leaks2.mtrace
 
 include ../Rules
 
@@ -104,3 +106,12 @@ ifneq (no,$(PERL))
 tests: $(objpfx)mtrace-tst-leaks
 endif
 endif
+
+tst-leaks2-ENV = MALLOC_TRACE=$(objpfx)tst-leaks2.mtrace
+$(objpfx)mtrace-tst-leaks2: $(objpfx)tst-leaks2.out
+	$(common-objpfx)malloc/mtrace $(objpfx)tst-leaks2.mtrace > $@
+ifeq (no,$(cross-compiling))
+ifneq (no,$(PERL))
+xtests: $(objpfx)mtrace-tst-leaks2
+endif
+endif
--- libc/resolv/tst-leaks2.c.jj	2004-07-21 19:55:46.287620269 +0200
+++ libc/resolv/tst-leaks2.c	2004-07-21 20:03:47.549480733 +0200
@@ -0,0 +1,42 @@
+/* Tests for res_init in libresolv
+   Copyright (C) 2004 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#undef gethostbyname
+
+#include <mcheck.h>
+#include <netdb.h>
+#include <resolv.h>
+
+/* Prototype for our test function.  */
+extern int do_test (int argc, char *argv[]);
+
+/* This defines the `main' function and some more.  */
+#include <test-skeleton.c>
+
+int
+do_test (int argc, char *argv[])
+{
+  mtrace ();
+  for (int i = 0; i < 20; ++i)
+    {
+      res_init ();
+      gethostbyname ("www.gnu.org");
+    }
+  return 0;
+}

	Jakub

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH] Avoid leaks in res_init
  2004-07-21 17:39 [PATCH] Avoid leaks in res_init Jakub Jelinek
  2004-07-21 18:07 ` [PATCH] tst-leaks2 Jakub Jelinek
@ 2004-07-21 18:31 ` Ulrich Drepper
  1 sibling, 0 replies; 3+ messages in thread
From: Ulrich Drepper @ 2004-07-21 18:31 UTC (permalink / raw)
  To: Jakub Jelinek; +Cc: Glibc hackers

Applied, along with the test.

-- 
➧ Ulrich Drepper ➧ Red Hat, Inc. ➧ 444 Castro St ➧ Mountain View, CA ❖

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2004-07-21 18:31 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-07-21 17:39 [PATCH] Avoid leaks in res_init Jakub Jelinek
2004-07-21 18:07 ` [PATCH] tst-leaks2 Jakub Jelinek
2004-07-21 18:31 ` [PATCH] Avoid leaks in res_init Ulrich Drepper

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).