[libvirt] [PATCH 2/2] escape quotes for dsmasq conf contents

Shivaprasad G Bhat shivaprasadbhat at gmail.com
Mon Jun 1 08:10:04 UTC 2015


dnsmasq conf file contents needs to have quotes escaped for it to work.
Because of this, the network-create/start for a network with quotes
in the name fails. The patch escapes strings for the entries that go
into the conf file.

Signed-off-by: Shivaprasad G Bhat <sbhat at linux.vnet.ibm.com>
---
 src/util/virdnsmasq.c                              |   25 +++++++++++++++----
 src/util/virpidfile.c                              |   15 ++++++++----
 .../nat-network-name-with-quotes.conf              |   20 +++++++++++++++
 .../nat-network-name-with-quotes.xml               |   26 ++++++++++++++++++++
 tests/networkxml2conftest.c                        |    1 +
 5 files changed, 78 insertions(+), 9 deletions(-)
 create mode 100644 tests/networkxml2confdata/nat-network-name-with-quotes.conf
 create mode 100644 tests/networkxml2confdata/nat-network-name-with-quotes.xml

diff --git a/src/util/virdnsmasq.c b/src/util/virdnsmasq.c
index 6a2a2fb..18e53a3 100644
--- a/src/util/virdnsmasq.c
+++ b/src/util/virdnsmasq.c
@@ -151,6 +151,7 @@ addnhostsNew(const char *name,
              const char *config_dir)
 {
     dnsmasqAddnHostsfile *addnhostsfile;
+    virBuffer buf = VIR_BUFFER_INITIALIZER;
 
     if (VIR_ALLOC(addnhostsfile) < 0)
         return NULL;
@@ -158,13 +159,20 @@ addnhostsNew(const char *name,
     addnhostsfile->hosts = NULL;
     addnhostsfile->nhosts = 0;
 
-    if (virAsprintf(&addnhostsfile->path, "%s/%s.%s", config_dir, name,
-                    DNSMASQ_ADDNHOSTSFILE_SUFFIX) < 0)
+    virBufferAsprintf(&buf, "%s", config_dir);
+    virBufferEscapeString(&buf, "/%s", name);
+    virBufferAsprintf(&buf, ".%s", DNSMASQ_ADDNHOSTSFILE_SUFFIX);
+
+    if (virBufferCheckError(&buf) < 0)
+                goto error;
+
+    if (!(addnhostsfile->path = virBufferContentAndReset(&buf)))
         goto error;
 
     return addnhostsfile;
 
  error:
+    virBufferFreeAndReset(&buf);
     addnhostsFree(addnhostsfile);
     return NULL;
 }
@@ -357,6 +365,7 @@ hostsfileNew(const char *name,
              const char *config_dir)
 {
     dnsmasqHostsfile *hostsfile;
+    virBuffer buf = VIR_BUFFER_INITIALIZER;
 
     if (VIR_ALLOC(hostsfile) < 0)
         return NULL;
@@ -364,13 +373,19 @@ hostsfileNew(const char *name,
     hostsfile->hosts = NULL;
     hostsfile->nhosts = 0;
 
-    if (virAsprintf(&hostsfile->path, "%s/%s.%s", config_dir, name,
-                    DNSMASQ_HOSTSFILE_SUFFIX) < 0)
-        goto error;
+    virBufferAsprintf(&buf, "%s", config_dir);
+    virBufferEscapeString(&buf, "/%s", name);
+    virBufferAsprintf(&buf, ".%s", DNSMASQ_HOSTSFILE_SUFFIX);
 
+    if (virBufferCheckError(&buf) < 0)
+                goto error;
+
+    if (!(hostsfile->path = virBufferContentAndReset(&buf)))
+        goto error;
     return hostsfile;
 
  error:
+    virBufferFreeAndReset(&buf);
     hostsfileFree(hostsfile);
     return NULL;
 }
diff --git a/src/util/virpidfile.c b/src/util/virpidfile.c
index 8144ff9..58ab29f 100644
--- a/src/util/virpidfile.c
+++ b/src/util/virpidfile.c
@@ -45,12 +45,19 @@ VIR_LOG_INIT("util.pidfile");
 
 char *virPidFileBuildPath(const char *dir, const char* name)
 {
-    char *pidfile;
+    virBuffer buf = VIR_BUFFER_INITIALIZER;
 
-    if (virAsprintf(&pidfile, "%s/%s.pid", dir, name) < 0)
-        return NULL;
+    virBufferAsprintf(&buf, "%s", dir);
+    virBufferEscapeString(&buf, "/%s.pid", name);
 
-    return pidfile;
+    if (virBufferCheckError(&buf) < 0)
+        goto error;
+
+    return virBufferContentAndReset(&buf);
+
+ error:
+    virBufferFreeAndReset(&buf);
+    return NULL;
 }
 
 
diff --git a/tests/networkxml2confdata/nat-network-name-with-quotes.conf b/tests/networkxml2confdata/nat-network-name-with-quotes.conf
new file mode 100644
index 0000000..a1c839e
--- /dev/null
+++ b/tests/networkxml2confdata/nat-network-name-with-quotes.conf
@@ -0,0 +1,20 @@
+##WARNING:  THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
+##OVERWRITTEN AND LOST.  Changes to this configuration should be made using:
+##    virsh net-edit default"with"quotes"
+## or other application using the libvirt API.
+##
+## dnsmasq conf file created by libvirt
+strict-order
+except-interface=lo
+bind-interfaces
+listen-address=192.168.122.1
+listen-address=192.168.123.1
+listen-address=fc00:db8:ac10:fe01::1
+listen-address=fc00:db8:ac10:fd01::1
+listen-address=10.24.10.1
+srv-host=_name._tcp
+dhcp-range=192.168.122.2,192.168.122.254
+dhcp-no-override
+dhcp-lease-max=253
+dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default"with"quotes".hostsfile
+addn-hosts=/var/lib/libvirt/dnsmasq/default"with"quotes".addnhosts
diff --git a/tests/networkxml2confdata/nat-network-name-with-quotes.xml b/tests/networkxml2confdata/nat-network-name-with-quotes.xml
new file mode 100644
index 0000000..eba75d2
--- /dev/null
+++ b/tests/networkxml2confdata/nat-network-name-with-quotes.xml
@@ -0,0 +1,26 @@
+<network>
+  <name>default"with"quotes"</name>
+  <uuid>81ff0d90-c91e-6742-64da-4a736edb9a9b</uuid>
+  <forward dev='eth1' mode='nat'>
+    <interface dev='eth1'/>
+  </forward>
+  <bridge name='virbr0' stp='on' delay='0'/>
+  <dns>
+    <srv service='name' protocol='tcp'/>
+  </dns>
+  <ip address='192.168.122.1' netmask='255.255.255.0'>
+    <dhcp>
+      <range start='192.168.122.2' end='192.168.122.254'/>
+      <host mac='00:16:3e:77:e2:ed' name='a.example.com' ip='192.168.122.10'/>
+      <host mac='00:16:3e:3e:a9:1a' name='b.example.com' ip='192.168.122.11'/>
+    </dhcp>
+  </ip>
+  <ip family='ipv4' address='192.168.123.1' netmask='255.255.255.0'>
+  </ip>
+  <ip family='ipv6' address='fc00:db8:ac10:fe01::1' prefix='64'>
+  </ip>
+  <ip family='ipv6' address='fc00:db8:ac10:fd01::1' prefix='64'>
+  </ip>
+  <ip family='ipv4' address='10.24.10.1'>
+  </ip>
+</network>
diff --git a/tests/networkxml2conftest.c b/tests/networkxml2conftest.c
index fe95e8c..a5f2711 100644
--- a/tests/networkxml2conftest.c
+++ b/tests/networkxml2conftest.c
@@ -115,6 +115,7 @@ mymain(void)
     DO_TEST("netboot-network", restricted);
     DO_TEST("netboot-proxy-network", restricted);
     DO_TEST("nat-network-dns-srv-record-minimal", restricted);
+    DO_TEST("nat-network-name-with-quotes", restricted);
     DO_TEST("routed-network", full);
     DO_TEST("nat-network", dhcpv6);
     DO_TEST("nat-network-dns-txt-record", full);




More information about the libvir-list mailing list