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(a)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);