From 4250637e7d39ae8b663251db995d10b1612592ca Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Tue, 4 May 2004 13:40:30 +0000 Subject: [PATCH] improved the cleaning up of memory when we fail to resolve names due to out of memory (thanks to 'runtests.pl -t') --- lib/hash.c | 2 +- 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 */