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

Laine Stump laine at laine.org
Wed May 4 04:30:07 UTC 2011


On 05/03/2011 05:49 PM, Eric Blake wrote:
> 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.

This definitely fixes the FILE* leak, but do we really want to abort the 
loop (stop looking for more pidfiles) when fscanf fails on one pidfile? 
(dunno, just asking)

> ---
>
> 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;
>   }




More information about the libvir-list mailing list