[libvirt] [PATCH v3 03/21] LXC from native: import rootfs

Daniel P. Berrange berrange at redhat.com
Wed Feb 12 17:31:52 UTC 2014


On Wed, Feb 12, 2014 at 05:23:39PM +0000, Daniel P. Berrange wrote:
> On Wed, Feb 05, 2014 at 03:10:01PM +0100, Cédric Bosdonnat wrote:
> > LXC rootfs can be either a directory or a block device or an image
> > file. The first two types have been implemented, but the image file is
> > still to be done since LXC auto-guesses the file format at mount time
> > and the LXC driver doesn't support the 'auto' format.
> > ---
> >  src/lxc/lxc_native.c                         | 69 ++++++++++++++++++++++++++++
> >  tests/lxcconf2xmldata/lxcconf2xml-simple.xml |  4 ++
> >  2 files changed, 73 insertions(+)
> 
> ACK

Actually there's a crash on OOM in this patch due to a double-free
of the 'src' and 'dst' strings. I'm going to squash the following
change in before pushing it

Daniel

diff --git a/src/lxc/lxc_native.c b/src/lxc/lxc_native.c
index 86d0dd3..af9d34e 100644
--- a/src/lxc/lxc_native.c
+++ b/src/lxc/lxc_native.c
@@ -33,7 +33,9 @@
 
 
 static virDomainFSDefPtr
-lxcCreateFSDef(int type, char *src, char* dst)
+lxcCreateFSDef(int type,
+               const char *src,
+               const char* dst)
 {
     virDomainFSDefPtr def;
 
@@ -42,14 +44,23 @@ lxcCreateFSDef(int type, char *src, char* dst)
 
     def->type = type;
     def->accessmode = VIR_DOMAIN_FS_ACCESSMODE_PASSTHROUGH;
-    def->src = src;
-    def->dst = dst;
+    if (src && VIR_STRDUP(def->src, src) < 0)
+        goto error;
+    if (VIR_STRDUP(def->dst, dst) < 0)
+        goto error;
 
     return def;
+
+ error:
+    virDomainFSDefFree(def);
+    return NULL;
 }
 
 static int
-lxcAddFSDef(virDomainDefPtr def, int type, char *src, char *dst)
+lxcAddFSDef(virDomainDefPtr def,
+            int type,
+            const char *src,
+            const char *dst)
 {
     virDomainFSDefPtr fsDef = NULL;
 
@@ -71,30 +82,23 @@ static int
 lxcSetRootfs(virDomainDefPtr def,
              virConfPtr properties)
 {
-    char *fssrc = NULL;
-    char *fsdst = NULL;
     int type = VIR_DOMAIN_FS_TYPE_MOUNT;
     virConfValuePtr value;
 
     if (!(value = virConfGetValue(properties, "lxc.rootfs")) ||
-           !value->str ||
-           (VIR_STRDUP(fssrc, value->str) < 0) ||
-            VIR_STRDUP(fsdst, "/") < 0)
-        goto error;
+        !value->str) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("Missing lxc.rootfs configuration"));
+        return -1;
+    }
 
-    if (STRPREFIX(fssrc, "/dev/"))
+    if (STRPREFIX(value->str, "/dev/"))
         type = VIR_DOMAIN_FS_TYPE_BLOCK;
 
-
-    if (lxcAddFSDef(def, type, fssrc, fsdst) < 0)
-        goto error;
+    if (lxcAddFSDef(def, type, value->str, "/") < 0)
+        return -1;
 
     return 0;
-
-error:
-    VIR_FREE(fssrc);
-    VIR_FREE(fsdst);
-    return -1;
 }
 
 virDomainDefPtr

-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list