unit1609: fix mem-leak in OOM

Closes #4709
This commit is contained in:
Daniel Stenberg 2019-12-12 23:43:29 +01:00
parent f389953da0
commit 5ada900458
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2

View file

@ -100,6 +100,9 @@ UNITTEST_START
{ {
int i; int i;
int testnum = sizeof(tests) / sizeof(struct testcase); int testnum = sizeof(tests) / sizeof(struct testcase);
struct Curl_multi *multi = NULL;
struct Curl_easy *easy = NULL;
struct curl_slist *list = NULL;
/* important: we setup cache outside of the loop /* important: we setup cache outside of the loop
and also clean cache after the loop. In contrast,for example, and also clean cache after the loop. In contrast,for example,
@ -110,11 +113,9 @@ UNITTEST_START
int addressnum = sizeof (tests[i].address) / sizeof (*tests[i].address); int addressnum = sizeof (tests[i].address) / sizeof (*tests[i].address);
struct Curl_addrinfo *addr; struct Curl_addrinfo *addr;
struct Curl_dns_entry *dns; struct Curl_dns_entry *dns;
struct curl_slist *list;
void *entry_id; void *entry_id;
bool problem = false; bool problem = false;
struct Curl_multi *multi; easy = curl_easy_init();
struct Curl_easy *easy = curl_easy_init();
if(!easy) { if(!easy) {
curl_global_cleanup(); curl_global_cleanup();
return CURLE_OUT_OF_MEMORY; return CURLE_OUT_OF_MEMORY;
@ -122,21 +123,23 @@ UNITTEST_START
/* create a multi handle and add the easy handle to it so that the /* create a multi handle and add the easy handle to it so that the
hostcache is setup */ hostcache is setup */
multi = curl_multi_init(); multi = curl_multi_init();
if(!multi)
goto error;
curl_multi_add_handle(multi, easy); curl_multi_add_handle(multi, easy);
list = curl_slist_append(NULL, tests[i].optval); list = curl_slist_append(NULL, tests[i].optval);
if(!list) if(!list)
goto unit_test_abort; goto error;
curl_easy_setopt(easy, CURLOPT_RESOLVE, list); curl_easy_setopt(easy, CURLOPT_RESOLVE, list);
Curl_loadhostpairs(easy); if(Curl_loadhostpairs(easy))
goto error;
entry_id = (void *)aprintf("%s:%d", tests[i].host, tests[i].port); entry_id = (void *)aprintf("%s:%d", tests[i].host, tests[i].port);
if(!entry_id) { if(!entry_id)
curl_slist_free_all(list); goto error;
goto unit_test_abort;
}
dns = Curl_hash_pick(easy->dns.hostcache, entry_id, strlen(entry_id) + 1); dns = Curl_hash_pick(easy->dns.hostcache, entry_id, strlen(entry_id) + 1);
free(entry_id); free(entry_id);
entry_id = NULL; entry_id = NULL;
@ -194,14 +197,22 @@ UNITTEST_START
} }
curl_easy_cleanup(easy); curl_easy_cleanup(easy);
easy = NULL;
Curl_hash_destroy(&multi->hostcache); Curl_hash_destroy(&multi->hostcache);
curl_multi_cleanup(multi); curl_multi_cleanup(multi);
multi = NULL;
curl_slist_free_all(list); curl_slist_free_all(list);
list = NULL;
if(problem) { if(problem) {
unitfail++; unitfail++;
continue; continue;
} }
} }
goto unit_test_abort;
error:
curl_easy_cleanup(easy);
curl_multi_cleanup(multi);
curl_slist_free_all(list);
} }
UNITTEST_STOP UNITTEST_STOP