aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/hostip.c47
1 files changed, 27 insertions, 20 deletions
diff --git a/lib/hostip.c b/lib/hostip.c
index 05e6e8c34..05ba9d073 100644
--- a/lib/hostip.c
+++ b/lib/hostip.c
@@ -926,11 +926,8 @@ static Curl_addrinfo *my_getaddrinfo(struct connectdata *conn,
{
struct hostent *h = NULL;
in_addr_t in;
- int ret; /* this variable is unused on several platforms but used on some */
struct SessionHandle *data = conn->data;
-
(void)port; /* unused in IPv4 code */
- ret = 0; /* to prevent the compiler warning */
*waitp = 0; /* don't wait, we act synchronously */
@@ -1067,7 +1064,7 @@ static Curl_addrinfo *my_getaddrinfo(struct connectdata *conn,
else
#endif/* HAVE_GETHOSTBYNAME_R_6 */
#ifdef HAVE_GETHOSTBYNAME_R_3
- /* AIX, Digital Unix, HPUX 10, more? */
+ /* AIX, Digital Unix/Tru64, HPUX 10, more? */
/* For AIX 4.3 or later, we don't use gethostbyname_r() at all, because of
the plain fact that it does not return unique full buffers on each
@@ -1083,23 +1080,34 @@ static Curl_addrinfo *my_getaddrinfo(struct connectdata *conn,
Troels Walsted Hansen helped us work this out on March 3rd, 2003. */
if(CURL_NAMELOOKUP_SIZE >=
- (sizeof(struct hostent)+sizeof(struct hostent_data)))
+ (sizeof(struct hostent)+sizeof(struct hostent_data))) {
/* August 22nd, 2000: Albert Chin-A-Young brought an updated version
* that should work! September 20: Richard Prescott worked on the buffer
* size dilemma. */
- ret = gethostbyname_r(hostname,
+ res = gethostbyname_r(hostname,
(struct hostent *)buf,
(struct hostent_data *)((char *)buf +
sizeof(struct hostent)));
+ h_errnop= errno; /* we don't deal with this, but set it anyway */
+ }
+ else
+ res = -1; /* failure, too smallish buffer size */
+
+ if(!res) { /* success */
+
+ h = (struct hostent*)buf; /* result expected in h */
+
+ /* This is the worst kind of the different gethostbyname_r() interfaces.
+ Since we don't know how big buffer this particular lookup required,
+ we can't realloc down the huge alloc without doing closer analysis of
+ the returned data. Thus, we always use CURL_NAMELOOKUP_SIZE for every
+ name lookup. Fixing this would require an extra malloc() and then
+ calling pack_hostent() that subsequent realloc()s down the new memory
+ area to the actually used amount. */
+ }
else
- ret = -1; /* failure, too smallish buffer size */
-
- /* result expected in h */
- h = (struct hostent*)buf;
- h_errnop= errno; /* we don't deal with this, but set it anyway */
- if(ret)
#endif /* HAVE_GETHOSTBYNAME_R_3 */
{
infof(data, "gethostbyname_r(2) failed for %s\n", hostname);
@@ -1108,21 +1116,20 @@ static Curl_addrinfo *my_getaddrinfo(struct connectdata *conn,
}
#else /* HAVE_GETHOSTBYNAME_R */
else {
- if ((h = gethostbyname(hostname)) == NULL ) {
+ h = gethostbyname(hostname);
+ if (!h)
infof(data, "gethostbyname(2) failed for %s\n", hostname);
- }
- else
- {
+ else {
char *buf=(char *)malloc(CURL_NAMELOOKUP_SIZE);
- /* we make a copy of the hostent right now, right here, as the
- static one we got a pointer to might get removed when we don't
- want/expect that */
+ /* we make a copy of the hostent right now, right here, as the static
+ one we got a pointer to might get removed when we don't want/expect
+ that */
h = pack_hostent(&buf, h);
}
#endif /*HAVE_GETHOSTBYNAME_R */
}
- return (h);
+ return h;
}
#endif /* end of IPv4-specific code */