]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
util: Fix virCgroupGetMemoryStat
authorPeter Chubb <Peter.Chubb@data61.csiro.au>
Wed, 7 Nov 2018 23:40:24 +0000 (18:40 -0500)
committerJohn Ferlan <jferlan@redhat.com>
Wed, 14 Nov 2018 19:45:02 +0000 (14:45 -0500)
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: Peter Chubb <peter.chubb@data61.csiro.au>
Reviewed-by: John Ferlan <jferlan@redhat.com>
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
src/util/vircgroupv1.c
src/util/vircgroupv2.c

index 28a74474ee8259129c524cd1aa1802e3c095eb7b..ab1a2870a3ed0fcd96bb90a5e881859bd71b5722 100644 (file)
@@ -1476,7 +1476,7 @@ virCgroupV1GetMemoryStat(virCgroupPtr group,
 
     line = stat;
 
-    while (line) {
+    while (*line) {
         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;
index 32adb0678413fd11f06125da6a3dd19c14c2a57b..85aa62bd4cba2145333684cf569f0d99a0139716 100644 (file)
@@ -1068,7 +1068,7 @@ virCgroupV2GetMemoryStat(virCgroupPtr group,
 
     line = stat;
 
-    while (line) {
+    while (*line) {
         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;