[libvirt] [PATCH] cgroup: avoid leaking a file

Eric Blake eblake at redhat.com
Tue May 3 21:49:58 UTC 2011


Clang detected a dead store to rc.  It turns out that in fixing this,
I also found a FILE* leak.

* src/util/cgroup.c (virCgroupKillInternal): Abort rather than
resuming loop on fscanf failure, and cleanup file on error.
---

As a bonus, this also fixes a decl-after-statement for fp.

 src/util/cgroup.c |    9 ++++++---
 1 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/src/util/cgroup.c b/src/util/cgroup.c
index afe8731..62b371d 100644
--- a/src/util/cgroup.c
+++ b/src/util/cgroup.c
@@ -1351,7 +1351,9 @@ static int virCgroupKillInternal(virCgroupPtr group, int signum, virHashTablePtr
     int killedAny = 0;
     char *keypath = NULL;
     bool done = false;
-    VIR_DEBUG("group=%p path=%s signum=%d pids=%p", group, group->path, signum, pids);
+    FILE *fp = NULL;
+    VIR_DEBUG("group=%p path=%s signum=%d pids=%p",
+              group, group->path, signum, pids);

     rc = virCgroupPathOfController(group, -1, "tasks", &keypath);
     if (rc != 0) {
@@ -1364,7 +1366,6 @@ static int virCgroupKillInternal(virCgroupPtr group, int signum, virHashTablePtr
      */
     while (!done) {
         done = true;
-        FILE *fp;
         if (!(fp = fopen(keypath, "r"))) {
             rc = -errno;
             VIR_DEBUG("Failed to read %s: %m\n", keypath);
@@ -1376,7 +1377,8 @@ static int virCgroupKillInternal(virCgroupPtr group, int signum, virHashTablePtr
                     if (feof(fp))
                         break;
                     rc = -errno;
-                    break;
+                    VIR_DEBUG("Failed to read %s: %m\n", keypath);
+                    goto cleanup;
                 }
                 if (virHashLookup(pids, (void*)pid))
                     continue;
@@ -1403,6 +1405,7 @@ static int virCgroupKillInternal(virCgroupPtr group, int signum, virHashTablePtr

 cleanup:
     VIR_FREE(keypath);
+    VIR_FORCE_FCLOSE(fp);

     return rc;
 }
-- 
1.7.4.4




More information about the libvir-list mailing list