On 03/09/2012 12:13 PM, Crístian Viana wrote:
If there is a disk file with a comma in the name, QEmu expects a
double
comma instead of a single one (e.g., the file "virtual,disk.img" needs
to be specified as "virtual,,disk.img" in QEmu's command line). This
patch fixes libvirt to work with that feature. Fix RHBZ #801036.
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index de2d4a1..685a278 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -1628,6 +1628,48 @@ qemuSafeSerialParamValue(const char *value)
return 0;
}
+static const char *
Use 'char *', not 'const char *', when returning a malloc'd string;
that
gives the caller a hint that they should free what they are receiving.
+qemuEscapeCommas(const char *name)
+{
+ const char *name_ptr = name;
+ char *escaped_name, *escaped_name_ptr;
+ size_t escaped_name_max_size = (strlen(name) * 2) + 1;
Technically, this could overflow. Copying from virBufferEscape() in
buf.c shows that we can use xalloc_oversized to avoid this (admittedly
unlikely) scenario.
+
+ /* Reduce the string memory size to its current length. */
+ VIR_SHRINK_N(escaped_name, escaped_name_max_size,
+ strlen(escaped_name) - strlen(name));
Indentation.
That's a lot of calls to strlen(name); it's nicer to cache it up front.
+
+ return escaped_name;
+}
+
static int
qemuBuildRBDString(virConnectPtr conn,
virDomainDiskDefPtr disk,
@@ -1638,7 +1680,7 @@ qemuBuildRBDString(virConnectPtr conn,
char *secret = NULL;
size_t secret_size;
- virBufferAsprintf(opt, "rbd:%s", disk->src);
+ virBufferAsprintf(opt, "rbd:%s", qemuEscapeCommas(disk->src));
Memory leak. Not good.
Oooh - we're printing to a virBuffer, and we already have
virBufferEscape which _almost_ does what we want - it's just that we
want to escape with ',' instead of '\\'. I think I have a more
efficient solution coming on :)
@@ -2134,7 +2176,6 @@ error:
return NULL;
}
-
char *
Spurious whitespace change.
You also need a testsuite addition to ensure that this actually does
what we want. And in fact, it didn't - we need to enhance the RNG to
allow commas in file names to validate, and we need to fix the
domxml-from-native routine after all.
If I were to keep the patch authorship in your name, I would squash 2/2
into this one (otherwise, 'make syntax-check' will fail during a 'git
bisect' that settles on 1/2 in isolation). But since I practically
rewrote the thing, I will instead post a v2 with myself as author but
mentioning your name in the commit message. Stay tuned...
--
Eric Blake eblake(a)redhat.com +1-919-301-3266
Libvirt virtualization library
http://libvirt.org