apr-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Ian Holsman <i...@cnet.com>
Subject Re: [PATCH] Add reentrant gethostbyname call
Date Fri, 20 Jul 2001 02:54:56 GMT
Justin Erenkrantz wrote:

>During some testing with flood (~30 threads), we ran into a stack
>corruption error in our code.  We tracked it down to the fact that we
>were using a non-reentrant version of gethostbyname.  This patch lets
>us call the reentrant version of gethostbyname and now we haven't
>been able to recreate the segfault.
>
>The only possible optimization would be the size of the temporary
>buffer (currently 256).  Roy mentioned that the address array in 
>hostent has a maximum of 10 entries.  If so, the size of the 
>structure plus the maximum size of the array (10 entries) may be 
>sufficient.  If we send in a too small buffer, we should 
>receive ERANGE.
>
Is there a reason why we shouldn't just use the re-entrant versions
where it is available?

also you can't use APR_HAS_THREADS to check,
as someone could have threads turned on in BSD, which
doesnt have a gethostbyname_r function
(at least acording to cvs.apache.org's man pages)

..Ian

>
>
>Any reason we shouldn't commit?  -- justin
>
>Index: network_io/unix/sa_common.c
>===================================================================
>RCS file: /home/cvs/apr/network_io/unix/sa_common.c,v
>retrieving revision 1.34
>diff -u -r1.34 sa_common.c
>--- network_io/unix/sa_common.c	2001/05/02 02:54:11	1.34
>+++ network_io/unix/sa_common.c	2001/07/20 02:29:30
>@@ -380,6 +380,11 @@
>         struct hostent *hp;
>         apr_sockaddr_t *cursa;
>         int curaddr;
>+#if APR_HAS_THREADS
>+        char tmp[256];
>+        int hosterror;
>+        struct hostent hs;
>+#endif
> 
>         if (family == APR_UNSPEC) {
>             family = APR_INET; /* we don't support IPv6 here */
>@@ -395,11 +400,17 @@
>         }
>         else {
> #endif
>+#if APR_HAS_THREADS
>+        hp = gethostbyname_r(hostname, &hs, tmp, 255, &hosterror);
>+#else
>         hp = gethostbyname(hostname);
>+#endif
> 
>         if (!hp)  {
> #ifdef WIN32
>             apr_get_netos_error();
>+#elif APR_HAS_THREADS
>+            return (hosterror + APR_OS_START_SYSERR);
> #else
>             return (h_errno + APR_OS_START_SYSERR);
> #endif
>




Mime
View raw message