]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Don't leak memory if returning from
authorNgie Cooper <yanegomi@gmail.com>
Sun, 11 Dec 2016 00:32:16 +0000 (16:32 -0800)
committerNgie Cooper <yanegomi@gmail.com>
Sun, 11 Dec 2016 00:32:16 +0000 (16:32 -0800)
assertion_file_contains_lines_any_order(..) early

Free memory consistently at the bottom of the function

Reported by: Coverity
CID: 1331678

tar/test/main.c

index 9bb7964c465aa4cd49aa09d1ead7e388a4ead72d..8d31706f0d638764cda657de437545b212857a1a 100644 (file)
@@ -1060,7 +1060,7 @@ assertion_file_contains_lines_any_order(const char *file, int line,
        char **expected = NULL;
        char *p, **actual = NULL;
        char c;
-       int expected_failure = 0, actual_failure = 0;
+       int expected_failure = 0, actual_failure = 0, retval = 0;
 
        assertion_count(file, line);
 
@@ -1081,8 +1081,7 @@ assertion_file_contains_lines_any_order(const char *file, int line,
                if (expected == NULL) {
                        failure_start(pathname, line, "Can't allocate memory");
                        failure_finish(NULL);
-                       free(expected);
-                       return (0);
+                       goto done;
                }
                for (i = 0; lines[i] != NULL; ++i) {
                        expected[i] = strdup(lines[i]);
@@ -1103,8 +1102,7 @@ assertion_file_contains_lines_any_order(const char *file, int line,
                if (actual == NULL) {
                        failure_start(pathname, line, "Can't allocate memory");
                        failure_finish(NULL);
-                       free(expected);
-                       return (0);
+                       goto done;
                }
                for (j = 0, p = buff; p < buff + buff_size;
                    p += 1 + strlen(p)) {
@@ -1141,27 +1139,27 @@ assertion_file_contains_lines_any_order(const char *file, int line,
                        ++actual_failure;
        }
        if (expected_failure == 0 && actual_failure == 0) {
-               free(buff);
-               free(expected);
-               free(actual);
-               return (1);
+               retval = 1;
+               goto done;
        }
        failure_start(file, line, "File doesn't match: %s", pathname);
        for (i = 0; i < expected_count; ++i) {
-               if (expected[i] != NULL) {
+               if (expected[i] != NULL)
                        logprintf("  Expected but not present: %s\n", expected[i]);
-                       free(expected[i]);
-               }
        }
        for (j = 0; j < actual_count; ++j) {
                if (actual[j] != NULL)
                        logprintf("  Present but not expected: %s\n", actual[j]);
        }
        failure_finish(NULL);
+done:
+       free(actual);
        free(buff);
+       for (i = 0; i < expected_count; ++i)
+               free(expected[i]);
        free(expected);
-       free(actual);
-       return (0);
+
+       return (retval);
 }
 
 /* Verify that a text file does not contains the specified strings */