[libvirt] [PATCH 1/2] util: Fix virCgroupGetMemoryStat
Pavel Hrdina
phrdina at redhat.com
Tue Nov 13 12:43:14 UTC 2018
On Wed, Nov 07, 2018 at 06:57:39PM -0500, John Ferlan wrote:
> From: Peter Chubb <Peter.Chubb at data61.csiro.au>
>
> Commit 901d2b9c introduced virCgroupGetMemoryStat and replaced
> the LXC virLXCCgroupGetMemStat logic in commit e634c7cd0. However,
> in doing so the replacement wasn't exact as the LXC logic used
> getline() to process the cgroup controller data, while the new
> virCgroupGetMemoryStat used "memory.stat" manual buffer read/
> processing which neglected to forward through @line in order
> to read each line in the output.
>
> To fix that, we should be sure to carry forward the @line value
> for each line read updating it beyond that current @newLine value
> once we've calculated the values that we want.
>
> Signed-off-by: John Ferlan <jferlan at redhat.com>
> ---
> src/util/vircgroupv1.c | 7 ++++++-
> src/util/vircgroupv2.c | 7 ++++++-
> 2 files changed, 12 insertions(+), 2 deletions(-)
>
> diff --git a/src/util/vircgroupv1.c b/src/util/vircgroupv1.c
> index 28a74474ee..678ffda35c 100644
> --- a/src/util/vircgroupv1.c
> +++ b/src/util/vircgroupv1.c
> @@ -1476,7 +1476,7 @@ virCgroupV1GetMemoryStat(virCgroupPtr group,
>
> line = stat;
>
> - while (line) {
> + while (line && *line) {
There is no need to check line, it cannot be NULL.
> char *newLine = strchr(line, '\n');
> char *valueStr = strchr(line, ' ');
> unsigned long long value;
> @@ -1506,6 +1506,11 @@ virCgroupV1GetMemoryStat(virCgroupPtr group,
> inactiveFileVal = value >> 10;
> else if (STREQ(line, "unevictable"))
> unevictableVal = value >> 10;
> +
> + if (newLine)
> + line = newLine + 1;
> + else
> + break;
> }
>
> *cache = cacheVal;
> diff --git a/src/util/vircgroupv2.c b/src/util/vircgroupv2.c
> index 32adb06784..541e8e790e 100644
> --- a/src/util/vircgroupv2.c
> +++ b/src/util/vircgroupv2.c
> @@ -1068,7 +1068,7 @@ virCgroupV2GetMemoryStat(virCgroupPtr group,
>
> line = stat;
>
> - while (line) {
> + while (line && *line) {
Same here.
> char *newLine = strchr(line, '\n');
> char *valueStr = strchr(line, ' ');
> unsigned long long value;
> @@ -1102,6 +1102,11 @@ virCgroupV2GetMemoryStat(virCgroupPtr group,
> inactiveFileVal = value >> 10;
> else if (STREQ(line, "unevictable"))
> unevictableVal = value >> 10;
> +
> + if (newLine)
> + line = newLine + 1;
> + else
> + break;
> }
>
> *cache = cacheVal;
> --
Reviewed-by: Pavel Hrdina <phrdina at redhat.com>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20181113/1240ea83/attachment-0001.sig>
More information about the libvir-list
mailing list