[libvirt] [PATCH 01/10] Replace sscanf in legacy device address parsing

Matthias Bolte matthias.bolte at googlemail.com
Tue Mar 30 16:20:25 UTC 2010


---
 src/conf/domain_conf.c |   38 ++++++++++++++++++++++++++------------
 1 files changed, 26 insertions(+), 12 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 66aa53e..9a517ca 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -1290,6 +1290,26 @@ cleanup:
     return ret;
 }
 
+static int
+virDomainParseLegacyDeviceAddress(char *devaddr,
+                                  virDomainDevicePCIAddressPtr pci)
+{
+    char *tmp = devaddr + strspn(devaddr, " \t\r\n");
+
+    /* expected format: <domain>:<bus>:<slot> */
+    if (virStrToLong_ui(tmp, &tmp, 16, &pci->domain) < 0 ||
+        tmp == NULL || *tmp != ':')
+        return -1;
+
+    if (virStrToLong_ui(tmp + 1, &tmp, 16, &pci->bus) < 0 ||
+        tmp == NULL || *tmp != ':')
+        return -1;
+
+    if (virStrToLong_ui(tmp + 1, &tmp, 16, &pci->slot) < 0)
+        return -1;
+
+    return 0;
+}
 
 int
 virDomainDiskDefAssignAddress(virDomainDiskDefPtr def)
@@ -1541,10 +1561,8 @@ virDomainDiskDefParseXML(xmlNodePtr node,
     }
 
     if (devaddr) {
-        if (sscanf(devaddr, "%x:%x:%x",
-                   &def->info.addr.pci.domain,
-                   &def->info.addr.pci.bus,
-                   &def->info.addr.pci.slot) < 3) {
+        if (virDomainParseLegacyDeviceAddress(devaddr,
+                                              &def->info.addr.pci) < 3) {
             virDomainReportError(VIR_ERR_INTERNAL_ERROR,
                                  _("Unable to parse devaddr parameter '%s'"),
                                  devaddr);
@@ -1894,10 +1912,8 @@ virDomainNetDefParseXML(virCapsPtr caps,
     }
 
     if (devaddr) {
-        if (sscanf(devaddr, "%x:%x:%x",
-                   &def->info.addr.pci.domain,
-                   &def->info.addr.pci.bus,
-                   &def->info.addr.pci.slot) < 3) {
+        if (virDomainParseLegacyDeviceAddress(devaddr,
+                                              &def->info.addr.pci) < 0) {
             virDomainReportError(VIR_ERR_INTERNAL_ERROR,
                                  _("Unable to parse devaddr parameter '%s'"),
                                  devaddr);
@@ -3215,10 +3231,8 @@ virDomainHostdevSubsysPciDefParseXML(const xmlNodePtr node,
                 /* Legacy back-compat. Don't add any more attributes here */
                 char *devaddr = virXMLPropString(cur, "devaddr");
                 if (devaddr &&
-                    sscanf(devaddr, "%x:%x:%x",
-                           &def->info.addr.pci.domain,
-                           &def->info.addr.pci.bus,
-                           &def->info.addr.pci.slot) < 3) {
+                    virDomainParseLegacyDeviceAddress(devaddr,
+                                                      &def->info.addr.pci) < 0) {
                     virDomainReportError(VIR_ERR_INTERNAL_ERROR,
                                          _("Unable to parse devaddr parameter '%s'"),
                                          devaddr);
-- 
1.6.3.3




More information about the libvir-list mailing list