Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 16 Feb 2005 10:19:03 -0500
From:      Brian Fundakowski Feldman <green@freebsd.org>
To:        Dag-Erling =?iso-8859-1?Q?Sm=F8rgrav?= <des@des.no>
Cc:        hackers@freebsd.org
Subject:   Re: memory leak in resolver
Message-ID:  <20050216151903.GD1069@green.homeunix.org>
In-Reply-To: <86mzu4sqk5.fsf@xps.des.no>
References:  <86mzu4sqk5.fsf@xps.des.no>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, Feb 16, 2005 at 12:16:26PM +0100, Dag-Erling Smørgrav wrote:
> des@xps ~/src/gai% cat gai.c
> #include <sys/types.h>
> #include <sys/socket.h>
> #include <netdb.h>
> #include <string.h>
> 
> int
> main(void)
> {
>         struct addrinfo hint, *res;
> 
>         memset(&hint, 0, sizeof(hint));
>         hint.ai_family = AF_INET;
>         hint.ai_socktype = SOCK_STREAM;
>         hint.ai_protocol = 0;
>         if (getaddrinfo("www.freebsd.org", "http", &hint, &res) == 0)
>                 freeaddrinfo(res);
>         return (0);
> }
> des@xps ~/src/gai% valgrind --leak-check=yes --num-callers=8 ./gai
> ==44998== Memcheck, a memory error detector for x86-linux.
> ==44998== Copyright (C) 2002-2004, and GNU GPL'd, by Julian Seward.
> ==44998== Using valgrind-2.1.0, a program supervision framework for x86-linux.
> ==44998== Copyright (C) 2000-2004, and GNU GPL'd, by Julian Seward.
> ==44998== Estimated CPU clock rate is 3591 MHz
> ==44998== For more details, rerun with: -v
> ==44998==
> ==44998==
> ==44998== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
> ==44998== malloc/free: in use at exit: 2328 bytes in 11 blocks.
> ==44998== malloc/free: 45 allocs, 34 frees, 232569 bytes allocated.
> ==44998== For counts of detected errors, rerun with: -v
> ==44998== searching for pointers to 11 not-freed blocks.
> ==44998== checked 1258740 bytes.
> ==44998==
> ==44998== 49 bytes in 5 blocks are definitely lost in loss record 2 of 5
> ==44998==    at 0x3C033173: malloc (vg_replace_malloc.c:105)
> ==44998==    by 0x3C0D567E: strdup (strdup.c:52)
> ==44998==    by 0x3C0D0403: _nsyylex (nslexer.l:88)
> ==44998==    by 0x3C0CF903: _nsyyparse (y.tab.c:380)
> ==44998==    by 0x3C0D296E: _nsdispatch (nsdispatch.c:353)
> ==44998==    by 0x3C0C6E33: getaddrinfo (getaddrinfo.c:1646)
> ==44998==    by 0x804856C: main (gai.c:15)
> ==44998==
> ==44998== LEAK SUMMARY:
> ==44998==    definitely lost: 49 bytes in 5 blocks.
> ==44998==    possibly lost:   0 bytes in 0 blocks.
> ==44998==    still reachable: 2279 bytes in 6 blocks.
> ==44998==         suppressed: 0 bytes in 0 blocks.
> ==44998== Reachable blocks (those to which a pointer was found) are not shown.
> ==44998== To see them, rerun with: --show-reachable=yes
> 
> The amount of memory leaked seems constant regardless of how many
> times getaddrinfo() is called, so it's probably from reading
> resolv.conf.

It looks like the memory leaked scales with the number of times that
the mtime of the configuration file changes during the process's lifetime.
(Of course, starting at one leak the first time it's used.)

-- 
Brian Fundakowski Feldman                           \'[ FreeBSD ]''''''''''\
  <> green@FreeBSD.org                               \  The Power to Serve! \
 Opinions expressed are my own.                       \,,,,,,,,,,,,,,,,,,,,,,\



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20050216151903.GD1069>