diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | resolv/Makefile | 15 | ||||
-rw-r--r-- | resolv/res_libc.c | 8 | ||||
-rw-r--r-- | resolv/tst-leaks2.c | 41 |
4 files changed, 69 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog index a4c8bf8281..bc15cb1e68 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +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. + * resolv/Makefile: Add rules to build and run tst-leaks2. + * resolv/tst-leaks2.c: New test. + 2004-07-21 Ulrich Drepper <drepper@redhat.com> * intl/libintl.h: Don't define macros for C++. diff --git a/resolv/Makefile b/resolv/Makefile index 743586b376..a91e8a6f44 100644 --- a/resolv/Makefile +++ b/resolv/Makefile @@ -33,8 +33,9 @@ routines := herror inet_addr inet_ntop inet_pton nsap_addr res_init \ 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-thread-library)) 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 diff --git a/resolv/res_libc.c b/resolv/res_libc.c index 66da110d5f..94bb2fdca6 100644 --- a/resolv/res_libc.c +++ b/resolv/res_libc.c @@ -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 diff --git a/resolv/tst-leaks2.c b/resolv/tst-leaks2.c new file mode 100644 index 0000000000..99a0a0f20c --- /dev/null +++ b/resolv/tst-leaks2.c @@ -0,0 +1,41 @@ +/* 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> + +static int +do_test (void) +{ + mtrace (); + for (int i = 0; i < 20; ++i) + { + res_init (); + gethostbyname ("www.gnu.org"); + } + return 0; +} + +#define TEST_FUNCTION do_test () +#define TIMEOUT 30 +/* This defines the `main' function and some more. */ +#include <test-skeleton.c> |