From d091518b353d49b772a1e68acbe0fd0be76e33d6 Mon Sep 17 00:00:00 2001 From: Pavel Hrdina Date: Tue, 5 May 2015 16:52:46 +0200 Subject: [PATCH] XML: escape strings where we should do it There is a lot of places, were it's pretty easy for user to enter some characters that we need to escape to create a valid XML description. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1197580 Signed-off-by: Pavel Hrdina --- src/conf/capabilities.c | 4 +-- src/conf/cpu_conf.c | 6 ++-- src/conf/domain_capabilities.c | 2 +- src/conf/domain_conf.c | 58 ++++++++++++++++------------------ src/conf/network_conf.c | 19 ++++++----- src/conf/node_device_conf.c | 4 +-- 6 files changed, 44 insertions(+), 49 deletions(-) diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c index c43bfb33e..36acf27e9 100644 --- a/src/conf/capabilities.c +++ b/src/conf/capabilities.c @@ -682,9 +682,9 @@ virCapabilitiesDomainDataLookupInternal(virCapsPtr caps, virBufferAsprintf(&buf, "domaintype=%s ", virDomainVirtTypeToString(domaintype)); if (emulator) - virBufferAsprintf(&buf, "emulator=%s ", emulator); + virBufferEscapeString(&buf, "emulator=%s ", emulator); if (machinetype) - virBufferAsprintf(&buf, "machine=%s ", machinetype); + virBufferEscapeString(&buf, "machine=%s ", machinetype); if (virBufferCurrentContent(&buf) && !virBufferCurrentContent(&buf)[0]) virBufferAsprintf(&buf, "%s", _("any configuration")); diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c index e959ecca0..1ba1d8209 100644 --- a/src/conf/cpu_conf.c +++ b/src/conf/cpu_conf.c @@ -544,17 +544,17 @@ virCPUDefFormatBuf(virBufferPtr buf, } virBufferAsprintf(buf, " fallback='%s'", fallback); if (def->vendor_id) - virBufferAsprintf(buf, " vendor_id='%s'", def->vendor_id); + virBufferEscapeString(buf, " vendor_id='%s'", def->vendor_id); } if (formatModel && def->model) { - virBufferAsprintf(buf, ">%s\n", def->model); + virBufferEscapeString(buf, ">%s\n", def->model); } else { virBufferAddLit(buf, "/>\n"); } } if (formatModel && def->vendor) - virBufferAsprintf(buf, "%s\n", def->vendor); + virBufferEscapeString(buf, "%s\n", def->vendor); if (def->sockets && def->cores && def->threads) { virBufferAddLit(buf, "\n"); virBufferAdjustIndent(buf, 2); - virBufferAsprintf(buf, "%s\n", caps->path); + virBufferEscapeString(buf, "%s\n", caps->path); virBufferAsprintf(buf, "%s\n", virttype_str); virBufferAsprintf(buf, "%s\n", caps->machine); virBufferAsprintf(buf, "%s\n", arch_str); diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 19b4d9515..add857cb9 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -3724,7 +3724,7 @@ virDomainDeviceInfoFormat(virBufferPtr buf, virBufferAsprintf(buf, " bar='%s'", rombar); } if (info->romfile) - virBufferAsprintf(buf, " file='%s'", info->romfile); + virBufferEscapeString(buf, " file='%s'", info->romfile); virBufferAddLit(buf, "/>\n"); } @@ -17716,7 +17716,7 @@ virSecurityDeviceLabelDefFormat(virBufferPtr buf, virBufferAddLit(buf, "model) - virBufferAsprintf(buf, " model='%s'", def->model); + virBufferEscapeString(buf, " model='%s'", def->model); if (def->labelskip) virBufferAddLit(buf, " labelskip='yes'"); @@ -19250,50 +19250,46 @@ virDomainChrSourceDefFormat(virBufferPtr buf, break; case VIR_DOMAIN_CHR_TYPE_NMDM: - virBufferAsprintf(buf, "\n", - def->data.nmdm.master, - def->data.nmdm.slave); + virBufferEscapeString(buf, "data.nmdm.master); + virBufferEscapeString(buf, "slave='%s'/>\n", def->data.nmdm.slave); break; case VIR_DOMAIN_CHR_TYPE_UDP: if (def->data.udp.bindService && def->data.udp.bindHost) { - virBufferAsprintf(buf, - "\n", - def->data.udp.bindHost, - def->data.udp.bindService); + virBufferEscapeString(buf, "data.udp.bindHost); + virBufferEscapeString(buf, "service='%s'/>\n", + def->data.udp.bindService); } else if (def->data.udp.bindHost) { - virBufferAsprintf(buf, "\n", - def->data.udp.bindHost); + virBufferEscapeString(buf, "\n", + def->data.udp.bindHost); } else if (def->data.udp.bindService) { - virBufferAsprintf(buf, "\n", - def->data.udp.bindService); + virBufferEscapeString(buf, "\n", + def->data.udp.bindService); } if (def->data.udp.connectService && def->data.udp.connectHost) { - virBufferAsprintf(buf, - "\n", - def->data.udp.connectHost, - def->data.udp.connectService); + virBufferEscapeString(buf, "data.udp.connectHost); + virBufferEscapeString(buf, "service='%s'/>\n", + def->data.udp.connectService); } else if (def->data.udp.connectHost) { - virBufferAsprintf(buf, "\n", - def->data.udp.connectHost); + virBufferEscapeString(buf, "\n", + def->data.udp.connectHost); } else if (def->data.udp.connectService) { - virBufferAsprintf(buf, - "\n", - def->data.udp.connectService); + virBufferEscapeString(buf, "\n", + def->data.udp.connectService); } break; case VIR_DOMAIN_CHR_TYPE_TCP: - virBufferAsprintf(buf, - "\n", - def->data.tcp.listen ? "bind" : "connect", - def->data.tcp.host, - def->data.tcp.service); + virBufferAsprintf(buf, "data.tcp.listen ? "bind" : "connect"); + virBufferEscapeString(buf, "host='%s' ", def->data.tcp.host); + virBufferEscapeString(buf, "service='%s'/>\n", def->data.tcp.service); virBufferAsprintf(buf, "\n", virDomainChrTcpProtocolTypeToString( def->data.tcp.protocol)); @@ -19307,8 +19303,8 @@ virDomainChrSourceDefFormat(virBufferPtr buf, break; case VIR_DOMAIN_CHR_TYPE_SPICEPORT: - virBufferAsprintf(buf, "\n", - def->data.spiceport.channel); + virBufferEscapeString(buf, "\n", + def->data.spiceport.channel); break; } diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index 5b734f262..bc63a3ddc 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -2422,21 +2422,20 @@ virNetworkDNSDefFormat(virBufferPtr buf, } for (i = 0; i < def->ntxts; i++) { - virBufferAsprintf(buf, "\n", - def->txts[i].name, - def->txts[i].value); + virBufferEscapeString(buf, "txts[i].name); + virBufferEscapeString(buf, "value='%s'/>\n", def->txts[i].value); } for (i = 0; i < def->nsrvs; i++) { if (def->srvs[i].service && def->srvs[i].protocol) { - virBufferAsprintf(buf, "srvs[i].service, - def->srvs[i].protocol); + virBufferEscapeString(buf, "srvs[i].service); + virBufferEscapeString(buf, "protocol='%s'", def->srvs[i].protocol); if (def->srvs[i].domain) - virBufferAsprintf(buf, " domain='%s'", def->srvs[i].domain); + virBufferEscapeString(buf, " domain='%s'", def->srvs[i].domain); if (def->srvs[i].target) - virBufferAsprintf(buf, " target='%s'", def->srvs[i].target); + virBufferEscapeString(buf, " target='%s'", def->srvs[i].target); if (def->srvs[i].port) virBufferAsprintf(buf, " port='%d'", def->srvs[i].port); if (def->srvs[i].priority) @@ -2455,8 +2454,8 @@ virNetworkDNSDefFormat(virBufferPtr buf, virBufferAsprintf(buf, "\n", ip); virBufferAdjustIndent(buf, 2); for (j = 0; j < def->hosts[i].nnames; j++) - virBufferAsprintf(buf, "%s\n", - def->hosts[i].names[j]); + virBufferEscapeString(buf, "%s\n", + def->hosts[i].names[j]); virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "\n"); diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c index a28684737..feae3d4e2 100644 --- a/src/conf/node_device_conf.c +++ b/src/conf/node_device_conf.c @@ -514,8 +514,8 @@ char *virNodeDeviceDefFormat(const virNodeDeviceDef *def) virBufferEscapeString(&buf, "%s\n", data->storage.vendor); if (data->storage.serial) - virBufferAsprintf(&buf, "%s\n", - data->storage.serial); + virBufferEscapeString(&buf, "%s\n", + data->storage.serial); if (data->storage.flags & VIR_NODE_DEV_CAP_STORAGE_REMOVABLE) { int avl = data->storage.flags & VIR_NODE_DEV_CAP_STORAGE_REMOVABLE_MEDIA_AVAILABLE; -- 2.39.5