[libvirt] [PATCH] cgroup: Free line even if no characters were read

Guannan Ren gren at redhat.com
Wed Jul 17 01:48:36 UTC 2013


On 07/16/2013 08:14 PM, Ján Tomko wrote:
> Even if getline doesn't read any characters it allocates a buffer.
>
> ==404== 120 bytes in 1 blocks are definitely lost in loss record 1,344 of 1,671
> ==404==    at 0x4C2C71B: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
> ==404==    by 0x906F862: getdelim (iogetdelim.c:68)
> ==404==    by 0x52A48FB: virCgroupPartitionNeedsEscaping (vircgroup.c:1136)
> ==404==    by 0x52A0FB4: virCgroupPartitionEscape (vircgroup.c:1171)
> ==404==    by 0x52A0EA4: virCgroupNewDomainPartition (vircgroup.c:1450)
>
> Introduced by f366273.
> ---
>
> Can STRPREFIX(path, line) be possibly true if tmp is NULL?
> path[NULL - line] would be accessed in that case.
>
>   src/util/vircgroup.c | 2 +-
>   1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c
> index 5a98393..2419d80 100644
> --- a/src/util/vircgroup.c
> +++ b/src/util/vircgroup.c
> @@ -1136,38 +1136,38 @@ static int virCgroupPartitionNeedsEscaping(const char *path)
>       while (getline(&line, &len, fp) > 0) {
>           if (STRPREFIX(line, "#subsys_name")) {
>               VIR_FREE(line);
>               continue;
>           }
>           char *tmp = strchr(line, ' ');
>           if (tmp)
>               *tmp = '\0';
>           len = tmp - line;
>   
>           if (STRPREFIX(path, line) &&
>               path[len] == '.') {
>               ret = 1;
> -            VIR_FREE(line);
>               goto cleanup;
>           }
>           VIR_FREE(line);
>       }
>   
>       if (ferror(fp)) {
>           ret = -EIO;
>           goto cleanup;
>       }
>   
>   cleanup:
> +    VIR_FREE(line);
>       VIR_FORCE_FCLOSE(fp);
>       return ret;
>   }
>   
>   static int virCgroupPartitionEscape(char **path)
>   {
>       size_t len = strlen(*path) + 1;
>       int rc;
>       char escape = '_';
>   
>       if ((rc = virCgroupPartitionNeedsEscaping(*path)) <= 0)
>           return rc;
>   

   ACK, I can reproduce the memory leak.




More information about the libvir-list mailing list