diff options
author | Jakub Hrozek <jhrozek@redhat.com> | 2011-06-14 16:52:32 +0200 |
---|---|---|
committer | Jakub Hrozek <jhrozek@redhat.com> | 2011-06-14 16:52:32 +0200 |
commit | 09f8a05573e3b94c50f0f8f72e39c48f24b7cf43 (patch) | |
tree | 3242bf2183a288478a29dfc96b640deac2722070 /ares_parse_ptr_reply.c | |
parent | a1116723d40b402d0690061c1b23858c33953d79 (diff) | |
download | c-ares-09f8a05573e3b94c50f0f8f72e39c48f24b7cf43.tar.gz c-ares-09f8a05573e3b94c50f0f8f72e39c48f24b7cf43.tar.bz2 c-ares-09f8a05573e3b94c50f0f8f72e39c48f24b7cf43.zip |
Do not leak rr_name on failures inside ares_parse_ptr_reply
Diffstat (limited to 'ares_parse_ptr_reply.c')
-rw-r--r-- | ares_parse_ptr_reply.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/ares_parse_ptr_reply.c b/ares_parse_ptr_reply.c index 9d5a8b5..3b6dbc3 100644 --- a/ares_parse_ptr_reply.c +++ b/ares_parse_ptr_reply.c @@ -99,6 +99,7 @@ int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr, aptr += len; if (aptr + RRFIXEDSZ > abuf + alen) { + free(rr_name); status = ARES_EBADRESP; break; } @@ -114,13 +115,17 @@ int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr, status = ares__expand_name_for_response(aptr, abuf, alen, &rr_data, &len); if (status != ARES_SUCCESS) - break; + { + free(rr_name); + break; + } if (hostname) free(hostname); hostname = rr_data; aliases[aliascnt] = malloc((strlen(rr_data)+1) * sizeof(char)); if (!aliases[aliascnt]) { + free(rr_name); status = ARES_ENOMEM; break; } @@ -131,6 +136,7 @@ int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr, alias_alloc *= 2; ptr = realloc(aliases, alias_alloc * sizeof(char *)); if(!ptr) { + free(rr_name); status = ARES_ENOMEM; break; } @@ -144,7 +150,10 @@ int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr, status = ares__expand_name_for_response(aptr, abuf, alen, &rr_data, &len); if (status != ARES_SUCCESS) - break; + { + free(rr_name); + break; + } free(ptrname); ptrname = rr_data; } |