]> granicus.if.org Git - curl/commitdiff
Fixes bug report #556930 - we need to make sure that the data is all right
authorDaniel Stenberg <daniel@haxx.se>
Fri, 17 May 2002 07:49:28 +0000 (07:49 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Fri, 17 May 2002 07:49:28 +0000 (07:49 +0000)
after we've realloc() the packed hostent struct.

lib/hostip.c

index 659135455711a4397947d1e7ad66351c7cd4873c..295bed606f5152433c52a5a0186d959dbf422cef 100644 (file)
@@ -354,6 +354,7 @@ Curl_addrinfo *Curl_getaddrinfo(struct SessionHandle *data,
 #else /* following code is IPv4-only */
 
 #ifndef HAVE_GETHOSTBYNAME_R
+static void hostcache_fixoffset(struct hostent *h, int offset);
 /**
  * Performs a "deep" copy of a hostent into a buffer (returns a pointer to the
  * copy). Make absolutely sure the destination buffer is big enough!
@@ -362,11 +363,12 @@ Curl_addrinfo *Curl_getaddrinfo(struct SessionHandle *data,
  * 10/3/2001 */
 static struct hostent* pack_hostent(char** buf, struct hostent* orig)
 {
-  char* bufptr;
+  char *bufptr;
+  char *newbuf;
   struct hostent* copy;
 
   int i;
-  charstr;
+  char *str;
   int len;
 
   bufptr = *buf;
@@ -427,7 +429,18 @@ static struct hostent* pack_hostent(char** buf, struct hostent* orig)
   }
   copy->h_addr_list[i] = NULL;
 
-  *buf=(char *)realloc(*buf, (int)bufptr-(int)(*buf));
+  /* now, shrink the allocated buffer to the size we actually need, which
+     most often is only a fraction of the original alloc */
+  newbuf=(char *)realloc(*buf, (int)bufptr-(int)(*buf));
+
+  /* if the alloc moved, we need to adjust things again */
+  if(newbuf != *buf)
+    hostcache_fixoffset((struct hostent*)newbuf, (int)newbuf-(int)*buf);
+
+  /* setup the return */
+  *buf = newbuf;
+  copy = (struct hostent*)newbuf;
+
   return copy;
 }
 #endif