[Bug manual/2801] New: Bug in gethostbyname_r() example

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

[Bug manual/2801] New: Bug in gethostbyname_r() example

conanhc at gmail dot com
http://www.gnu.org/software/libc/manual/html_node/Host-Names.html

The gethostbyname_r() call accepts a pointer to a struct hostent (&hostbuf in
the example) and a pointer to a pointer to a struct hostent (&hp in the
example).  The result of the lookup is stored in hostbuf itself and hp is set to
point at that buffer on success.

The hp pointer is returned by the example function, but shouldn't be.  The thing
it points to has automatic scope and so won't exist when the function returns.

Either,
 The example function gethostname() should accept a (hostent*) as a parameter,
or
 The hostbuf variable should be allocated statically (although that would
 defeat the purpose of a gethostbyname_r() call in the first place)

There is a secondary problem in that there is no (direct) way that the pointer
to the auxiliary buffer is passed back to the caller for later release of the
allocated memory - leading to a memory leak.  Perhaps that could be ignored in
example code though?

--
           Summary: Bug in gethostbyname_r() example
           Product: glibc
           Version: unspecified
            Status: NEW
          Severity: minor
          Priority: P2
         Component: manual
        AssignedTo: roland at gnu dot org
        ReportedBy: andyparkins at gmail dot com
                CC: glibc-bugs at sources dot redhat dot com


http://sourceware.org/bugzilla/show_bug.cgi?id=2801

------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.
Reply | Threaded
Open this post in threaded view
|

[Bug manual/2801] Bug in gethostbyname_r() example

conanhc at gmail dot com

------- Additional Comments From andyparkins at gmail dot com  2006-06-19 15:02 -------
In case it's of use, the following would work (but it's not very pretty):

/* Called like this:
        struct hostent myhost;
        char *auxbuf;
        auxbuf = gethostname( myhost, "www.example.com" );
        if( auxbuf ) {
                /* ... Do something with myhost ... */
                free( auxbuf );
        }
*/
char *gethostname( struct hostent *hostbuf, const char *host)
{
        struct hostent hostbuf, *hp;
        size_t hstbuflen;
        char *tmphstbuf;
        int res;
        int herr;

        hstbuflen = 1024;
        tmphstbuf = malloc (hstbuflen);

        while ((res = gethostbyname_r( host, hostbuf, tmphstbuf, hstbuflen,
                                        &hp, &herr)) == ERANGE)
        {
                /* Enlarge the buffer.  */
                hstbuflen *= 2;
                tmphstbuf = realloc (tmphstbuf, hstbuflen);
        }
        /*  Check for errors.  */
        if (res || hp == NULL)
                return NULL;
        return tmphstbuf;
}


--


http://sourceware.org/bugzilla/show_bug.cgi?id=2801

------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.