[libvirt] [PATCH 2/5] openvzGetProcessInfo: address clang-detected low-probability flaw

Jim Meyering jim at meyering.net
Wed Apr 14 08:46:05 UTC 2010


From: Jim Meyering <meyering at redhat.com>

* src/openvz/openvz_driver.c (openvzGetProcessInfo): Reorganize
so that unexpected /proc/vz/vestat content cannot make us use
uninitialized variables.  Without this change, an input line with
a matching "readvps", but fewer than 4 numbers would result in our
using at least "systime" uninitialized.
---
 src/openvz/openvz_driver.c |   30 +++++++++++++++---------------
 1 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
index 95c4236..47004d6 100644
--- a/src/openvz/openvz_driver.c
+++ b/src/openvz/openvz_driver.c
@@ -1384,14 +1384,15 @@ static int openvzGetProcessInfo(unsigned long long *cpuTime, int vpsid) {
     int fd;
     char line[1024] ;
     unsigned long long usertime, systime, nicetime;
-    int readvps = 0, ret;
+    int readvps = vpsid + 1;  /* ensure readvps is initially different */
+    int ret;

 /* read statistic from /proc/vz/vestat.
 sample:
 Version: 2.2
-      VEID     user      nice     system     uptime                 idle   other..
-        33       78         0       1330   59454597      142650441835148   other..
-        55      178         0       5340   59424597      542650441835148   other..
+   VEID     user      nice     system     uptime                 idle   other..
+     33       78         0       1330   59454597      142650441835148   other..
+     55      178         0       5340   59424597      542650441835148   other..
 */

     if ((fd = open("/proc/vz/vestat", O_RDONLY)) == -1)
@@ -1400,15 +1401,18 @@ Version: 2.2
     /*search line with VEID=vpsid*/
     while(1) {
         ret = openvz_readline(fd, line, sizeof(line));
-        if(ret <= 0)
+        if (ret <= 0)
             break;

-        if (sscanf(line, "%d %llu %llu %llu",
-                          &readvps, &usertime, &nicetime, &systime) != 4)
-            continue;
-
-        if (readvps == vpsid)
-            break; /*found vpsid*/
+        if (sscanf (line, "%d %llu %llu %llu",
+                    &readvps, &usertime, &nicetime, &systime) == 4
+            && readvps == vpsid) { /*found vpsid*/
+            /* convert jiffies to nanoseconds */
+            *cpuTime = (1000ull * 1000ull * 1000ull
+                        * (usertime + nicetime  + systime)
+                        / (unsigned long long)sysconf(_SC_CLK_TCK));
+            break;
+        }
     }

     close(fd);
@@ -1418,10 +1422,6 @@ Version: 2.2
     if (readvps != vpsid) /*not found*/
         return -1;

-    /* convert jiffies to nanoseconds */
-    *cpuTime = 1000ull * 1000ull * 1000ull * (usertime + nicetime  + systime)
-                                     / (unsigned long long)sysconf(_SC_CLK_TCK);
-
     return 0;
 }

-- 
1.7.1.rc1.248.gcefbb




More information about the libvir-list mailing list