diff options
author | Daniel Stenberg <daniel@haxx.se> | 2004-05-04 13:40:30 +0000 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2004-05-04 13:40:30 +0000 |
commit | 4250637e7d39ae8b663251db995d10b1612592ca (patch) | |
tree | 64f0e75edbf31f8080b04949ed318e80628bfd2e /lib | |
parent | 08d1da106ebe3817ce3aad083182fad4881a8d2a (diff) |
improved the cleaning up of memory when we fail to resolve names due to
out of memory (thanks to 'runtests.pl -t')
Diffstat (limited to 'lib')
-rw-r--r-- | lib/hash.c | 2 | ||||
-rw-r--r-- | lib/hostip.c | 11 |
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 */ |