]> granicus.if.org Git - curl/commitdiff
improved the cleaning up of memory when we fail to resolve names due to
authorDaniel Stenberg <daniel@haxx.se>
Tue, 4 May 2004 13:40:30 +0000 (13:40 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 4 May 2004 13:40:30 +0000 (13:40 +0000)
out of memory (thanks to 'runtests.pl -t')

lib/hash.c
lib/hostip.c

index 6769faacfc7d1e51471393ae5cec9cf3d037657e..619f2fb1b3871beb9150aa82c3854e30eca81d3c 100644 (file)
@@ -164,7 +164,7 @@ Curl_hash_add(curl_hash *h, char *key, size_t key_len, void *p)
     /* couldn't insert it, destroy the 'he' element again */
     hash_element_dtor(h, he);
   }
-  h->dtor(p); /* remove the NEW entry */
+
   return NULL; /* failure */
 }
 
index 27f5e8a9acc2049458c6b0f32322fa6c4f1fd1a1..4adcc1455f5029ef0f0239bdd7bbaa0a602c7c05 100644 (file)
@@ -314,6 +314,7 @@ Curl_cache_addr(struct SessionHandle *data,
   char *entry_id;
   size_t entry_len;
   struct Curl_dns_entry *dns;
+  struct Curl_dns_entry *dns2;
   time_t now;
 
   /* Create an entry id, based upon the hostname and port */
@@ -325,7 +326,6 @@ Curl_cache_addr(struct SessionHandle *data,
   /* Create a new cache entry */
   dns = (struct Curl_dns_entry *) malloc(sizeof(struct Curl_dns_entry));
   if (!dns) {
-    Curl_freeaddrinfo(addr);
     free(entry_id);
     return NULL;
   }
@@ -336,14 +336,15 @@ Curl_cache_addr(struct SessionHandle *data,
   /* Store the resolved data in our DNS cache. This function may return a
      pointer to an existing struct already present in the hash, and it may
      return the same argument we pass in. Make no assumptions. */
-  dns = Curl_hash_add(data->hostcache, entry_id, entry_len+1, (void *)dns);
-  if(!dns) {
-    /* Major badness, run away. When this happens, the 'dns' data has
-       already been cleared up by Curl_hash_add(). */
+  dns2 = Curl_hash_add(data->hostcache, entry_id, entry_len+1, (void *)dns);
+  if(!dns2) {
+    /* Major badness, run away. */
+    free(dns);
     free(entry_id);
     return NULL;
   }
   time(&now);
+  dns = dns2;
 
   dns->timestamp = now; /* used now */
   dns->inuse++;         /* mark entry as in-use */