Do not leak rr_name on failures inside ares_parse_ptr_reply
authorJakub Hrozek <jhrozek@redhat.com>
Tue, 14 Jun 2011 14:52:32 +0000 (16:52 +0200)
committerJakub Hrozek <jhrozek@redhat.com>
Tue, 14 Jun 2011 14:52:32 +0000 (16:52 +0200)
ares_parse_ptr_reply.c

index 9d5a8b564bc4de74668037e6959eb746fa267e7d..3b6dbc32e07338f6516a6d035d40247ef448d623 100644 (file)
@@ -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;
         }