]> xenbits.xensource.com Git - libvirt.git/commitdiff
tests: Resolve Coverity RESOURCE_LEAK in commandhelper
authorWang Rui <moon.wangrui@huawei.com>
Wed, 3 Sep 2014 18:59:31 +0000 (14:59 -0400)
committerJohn Ferlan <jferlan@redhat.com>
Wed, 3 Sep 2014 19:00:18 +0000 (15:00 -0400)
Coverity determined that 'log' and 'newenv' were not freed in
some cases. Free them in 'error' branch and normal branch.

Signed-off-by: Wang Rui <moon.wangrui@huawei.com>
tests/commandhelper.c

index 03fe50625a33982555d3e568cdc7b4cf1e657821..86ed8915c99d9d17035276a2a1742c12d701f540 100644 (file)
@@ -62,12 +62,13 @@ int main(int argc, char **argv) {
     size_t i, n;
     int open_max;
     char **origenv;
-    char **newenv;
+    char **newenv = NULL;
     char *cwd;
     FILE *log = fopen(abs_builddir "/commandhelper.log", "w");
+    int ret = EXIT_FAILURE;
 
     if (!log)
-        goto error;
+        goto cleanup;
 
     for (i = 1; i < argc; i++) {
         fprintf(log, "ARG:%s\n", argv[i]);
@@ -81,7 +82,7 @@ int main(int argc, char **argv) {
     }
 
     if (VIR_ALLOC_N_QUIET(newenv, n) < 0)
-        return EXIT_FAILURE;
+        goto cleanup;
 
     origenv = environ;
     n = i = 0;
@@ -101,7 +102,7 @@ int main(int argc, char **argv) {
 
     open_max = sysconf(_SC_OPEN_MAX);
     if (open_max < 0)
-        return EXIT_FAILURE;
+        goto cleanup;
     for (i = 0; i < open_max; i++) {
         int f;
         int closed;
@@ -115,7 +116,7 @@ int main(int argc, char **argv) {
 
     fprintf(log, "DAEMON:%s\n", getpgrp() == getsid(0) ? "yes" : "no");
     if (!(cwd = getcwd(NULL, 0)))
-        return EXIT_FAILURE;
+        goto cleanup;
     if (strlen(cwd) > strlen(".../commanddata") &&
         STREQ(cwd + strlen(cwd) - strlen("/commanddata"), "/commanddata"))
         strcpy(cwd, ".../commanddata");
@@ -124,11 +125,9 @@ int main(int argc, char **argv) {
 
     fprintf(log, "UMASK:%04o\n", umask(0));
 
-    VIR_FORCE_FCLOSE(log);
-
     if (argc > 1 && STREQ(argv[1], "--close-stdin")) {
         if (freopen("/dev/null", "r", stdin) != stdin)
-            goto error;
+            goto cleanup;
         usleep(100*1000);
     }
 
@@ -143,13 +142,13 @@ int main(int argc, char **argv) {
     for (;;) {
         got = read(STDIN_FILENO, buf, sizeof(buf));
         if (got < 0)
-            goto error;
+            goto cleanup;
         if (got == 0)
             break;
         if (safewrite(STDOUT_FILENO, buf, got) != got)
-            goto error;
+            goto cleanup;
         if (safewrite(STDERR_FILENO, buf, got) != got)
-            goto error;
+            goto cleanup;
     }
 
     fprintf(stdout, "END STDOUT\n");
@@ -157,10 +156,12 @@ int main(int argc, char **argv) {
     fprintf(stderr, "END STDERR\n");
     fflush(stderr);
 
-    return EXIT_SUCCESS;
+    ret = EXIT_SUCCESS;
 
- error:
-    return EXIT_FAILURE;
+ cleanup:
+    VIR_FORCE_FCLOSE(log);
+    VIR_FREE(newenv);
+    return ret;
 }
 
 #else