[libvirt] [PATCH] Fix qemu-nbd cleanup crashes

Cédric Bosdonnat cbosdonnat at suse.com
Fri Jul 10 09:38:15 UTC 2015


The virLXCControllerAppendNBDPids function didn't properly initialize
pids and npids. In case of failure it was crashing when freeing those.

The nbd device pid file doesn't appear immediately after starting
qemu-nbd: adding a small loop to wait for it.
---
 src/lxc/lxc_controller.c | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c
index 828b8a8..78d3eee 100644
--- a/src/lxc/lxc_controller.c
+++ b/src/lxc/lxc_controller.c
@@ -533,16 +533,31 @@ static int virLXCControllerAppendNBDPids(virLXCControllerPtr ctrl,
                                          const char *dev)
 {
     char *pidpath = NULL;
-    pid_t *pids;
-    size_t npids;
+    pid_t *pids = NULL;
+    size_t npids = 0;
     size_t i;
     int ret = -1;
+    size_t loops = 0;
     pid_t pid;
 
     if (!STRPREFIX(dev, "/dev/") ||
         virAsprintf(&pidpath, "/sys/devices/virtual/block/%s/pid", dev + 5) < 0)
         goto cleanup;
 
+    /* Wait for the pid file to appear */
+    while (!virFileExists(pidpath)) {
+        /* wait for 100ms before checking again, but don't do it for ever */
+        if (errno == ENOENT && loop < 10) {
+            usleep(100 * 1000);
+            loop++;
+        } else {
+            virReportSystemError(errno,
+                                 _("Cannot check NBD device %s pid"),
+                                 dev + 5);
+            goto cleanup;
+        }
+    }
+
     if (virPidFileReadPath(pidpath, &pid) < 0)
         goto cleanup;
 
-- 
2.1.4




More information about the libvir-list mailing list