aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2004-05-04 13:40:30 +0000
committerDaniel Stenberg <daniel@haxx.se>2004-05-04 13:40:30 +0000
commit4250637e7d39ae8b663251db995d10b1612592ca (patch)
tree64f0e75edbf31f8080b04949ed318e80628bfd2e
parent08d1da106ebe3817ce3aad083182fad4881a8d2a (diff)
improved the cleaning up of memory when we fail to resolve names due to
out of memory (thanks to 'runtests.pl -t')
-rw-r--r--lib/hash.c2
-rw-r--r--lib/hostip.c11
2 files changed, 7 insertions, 6 deletions
diff --git a/lib/hash.c b/lib/hash.c
index 6769faacf..619f2fb1b 100644
--- a/lib/hash.c
+++ b/lib/hash.c
@@ -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 */
}
diff --git a/lib/hostip.c b/lib/hostip.c
index 27f5e8a9a..4adcc1455 100644
--- a/lib/hostip.c
+++ b/lib/hostip.c
@@ -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 */