delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2002/12/10/14:11:11

Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sources.redhat.com/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sources.redhat.com/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com
Message-ID: <009001c2a080$11adb510$3492fea9@NOELG>
Reply-To: "Noel Gordon" <noelg AT blueskyinternet DOT com DOT au>
From: "Noel Gordon" <noelg AT blueskyinternet DOT com DOT au>
To: <pechtcha AT cs DOT nyu DOT edu>
Cc: <cygwin AT cygwin DOT com>
References: <Pine DOT GSO DOT 4 DOT 44 DOT 0212101024110 DOT 12239-100000 AT slinky DOT cs DOT nyu DOT edu>
Subject: Re: cygwin 1.3.17-1 gethostbyname() leak
Date: Wed, 11 Dec 2002 06:12:21 +1100
MIME-Version: 1.0
X-Priority: 3
X-MSMail-Priority: Normal
X-MimeOLE: Produced By Microsoft MimeOLE V5.00.2919.5600

> On Tue, 10 Dec 2002, Noel Gordon wrote:
>
> > Anyone else confirm that the following program compiled under
> > gcc 3.2, cygwin 1.3.17-1, on Win2k leaks memory?
> >
> > /*-----------------------------------------------------------*/
> >
> > #include <netdb.h>
> > #include <stdio.h>
> >
> > int main()
> > {
> >   struct hostent *host;
> >
> >   while ( 1 )
> >   {
> >     if ( ( host = gethostbyname( "localhost" ) ) != NULL )
> >       printf( "gethostbyname(): %s\n", host->h_name );
> >   }
> > }


On Wednesday, December 11, Igor Pechtchanski wrote

> Noel,
>
> From http://www.opengroup.org/onlinepubs/007904975/functions/gethostbyaddr.html :
>
>       The gethostbyaddr() and gethostbyname() functions *may* return
>       pointers to static data, which may be overwritten by subsequent
>       calls to any of these functions.
>
> The "may" above (emphasis is mine) means that the implementation is free
> to malloc a data structure and require the user to free it.  Since you
> don't free the returned data structure in your program, it's quite
> possible that there's a leak.  Also, Cygwin uses the gethostbyname from
> wsock32.dll, which may have different implementations on different
> systems.  Thus, your best bet is to look up gethostbyname on MSDN for
> implementation details.
>
> Igor


If it is true that cygwin uses gethostbyname() from wsock32.dll, and
returns the wsock32.dll hostent* result to the application, then it
is perhaps unwise to free() it. Following your tip, we find from ...


http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/gethostby
name_2.asp

  Remarks

  The gethostbyname function returns a pointer to a hostent structure - a
  structure allocated by Windows Sockets. The hostent structure contains
  the results of a successful search for the host specified in the name
  parameter [of gethostbyname()].

  The application must never attempt to modify this structure or to free
  any of its components. Furthermore, only one copy of this structure is
  allocated per thread, so the application should copy any information it
  needs before issuing any other Windows Sockets function calls.


...so there's seems to be more to it, but we can try free() approach for
fun, and quickly determine that doesn't help either. Ok, next stop is to
rip my code into test.c and compile with a "little" elaboration (-v) ...

noel AT NOELG ~/test
$ gcc -v -include /usr/include/netdb.h -o test test.c
Reading specs from /usr/lib/gcc-lib/i686-pc-cygwin/3.2/specs
Configured with: /netrel/src/gcc-3.2-2/configure --enable-languages=c,c++,f77,ja
[*snip*]
 /usr/lib/gcc-lib/i686-pc-cygwin/3.2/collect2.exe -Bdynamic --dll-search-prefix=
cyg -o test.exe /usr/lib/gcc-lib/i686-pc-cygwin/3.2/../../../crt0.o /usr/lib/gcc
-lib/i686-pc-cygwin/3.2/crtbegin.o -L/usr/lib/gcc-lib/i686-pc-cygwin/3.2 -L/usr/
lib/gcc-lib/i686-pc-cygwin/3.2/../../.. /cygdrive/c/WINNT/TEMP/ccTCpBgj.o -lgcc
-lcygwin -luser32 -lkernel32 -ladvapi32 -lshell32 -lgcc /usr/lib/gcc-lib/i686-pc
-cygwin/3.2/crtend.o


so we can see which -l libraries are linked against my test program during the
final (ie., collect2) compilation stage. And the first of these -l's to define
gethostbyname() is the -lcygwin library ...

noel AT NOELG ~/test
$ nm /usr/lib/libcygwin.a | grep gethostbyname
00000000 I __imp__gethostbyname
00000000 T _gethostbyname


Next to the implementation, which lives some in cygwin*.dll, so over to CVS to
find the component for gethostbyname(), and low and behold -- Corrina has been
diligently beavering away while we're just talking, and has updated the source
src/winsup/cygwin/net.cc to version 1.133, with a CVS log message

 * net.cc (free_protoent_ptr): Add missing free() for base structure.
 (free_servent_pt): Ditto.
 (free_hostent_pt): Ditto.


Thanks all, and well done Corrina, case closed. If private organisations fixed
issues this fast, the world might just become a better, less-buggy place.

-noel



--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Bug reporting:         http://cygwin.com/bugs.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019