]> xenbits.xensource.com Git - libvirt.git/commitdiff
virAsprintf: correctly check return value
authorJán Tomko <jtomko@redhat.com>
Thu, 18 Jul 2013 10:13:46 +0000 (12:13 +0200)
committerJán Tomko <jtomko@redhat.com>
Thu, 18 Jul 2013 12:05:46 +0000 (14:05 +0200)
When virAsprintf was changed from a function to a macro
reporting OOM error in dc6f2da, it was documented as returning
0 on success. This is incorrect, it returns the number of bytes
written as asprintf does.

Some of the functions were converted to use virAsprintf's return
value directly, changing the return value on success from 0 to >= 0.

For most of these, this is not a problem, but the change in
virPCIDriverDir breaks PCI passthrough.

The return value check in virhashtest pre-dates virAsprintf OOM
conversion.

vmwareMakePath seems to be unused.

src/qemu/qemu_command.c
src/qemu/qemu_process.c
src/util/virnetdev.c
src/util/virpci.c
src/util/virrandom.c
src/util/virstring.h
src/vmware/vmware_conf.c
tests/virhashtest.c

index 748cd8fa35389b6b4432265b948b976a8967e35e..110c87e7680c7f7936b266a65e616f15aadcb99e 100644 (file)
@@ -797,7 +797,9 @@ qemuAssignDeviceNetAlias(virDomainDefPtr def, virDomainNetDefPtr net, int idx)
         }
     }
 
-    return virAsprintf(&net->info.alias, "net%d", idx);
+    if (virAsprintf(&net->info.alias, "net%d", idx) < 0)
+        return -1;
+    return 0;
 }
 
 
@@ -852,7 +854,9 @@ qemuAssignDeviceRedirdevAlias(virDomainDefPtr def, virDomainRedirdevDefPtr redir
         }
     }
 
-    return virAsprintf(&redirdev->info.alias, "redir%d", idx);
+    if (virAsprintf(&redirdev->info.alias, "redir%d", idx) < 0)
+        return -1;
+    return 0;
 }
 
 
@@ -861,7 +865,10 @@ qemuAssignDeviceControllerAlias(virDomainControllerDefPtr controller)
 {
     const char *prefix = virDomainControllerTypeToString(controller->type);
 
-    return virAsprintf(&controller->info.alias, "%s%d", prefix, controller->idx);
+    if (virAsprintf(&controller->info.alias, "%s%d", prefix,
+                    controller->idx) < 0)
+        return -1;
+    return 0;
 }
 
 static ssize_t
index 3d5e8f6c4f00aa9bab60bd6d8cf932e7114de291..73b862dc315b762b4acdb035de9945bdb5d0109a 100644 (file)
@@ -2562,8 +2562,10 @@ qemuProcessPrepareMonitorChr(virQEMUDriverConfigPtr cfg,
     monConfig->type = VIR_DOMAIN_CHR_TYPE_UNIX;
     monConfig->data.nix.listen = true;
 
-    return virAsprintf(&monConfig->data.nix.path, "%s/%s.monitor",
-                       cfg->libDir, vm);
+    if (virAsprintf(&monConfig->data.nix.path, "%s/%s.monitor",
+                    cfg->libDir, vm) < 0)
+        return -1;
+    return 0;
 }
 
 
index aaa276dde64aaed709847ac6b43728ce439a0d3f..30df7a655c50fa05de64f75159db49c921fe503e 100644 (file)
@@ -1050,7 +1050,9 @@ virNetDevSysfsFile(char **pf_sysfs_device_link, const char *ifname,
                const char *file)
 {
 
-    return virAsprintf(pf_sysfs_device_link, NET_SYSFS "%s/%s", ifname, file);
+    if (virAsprintf(pf_sysfs_device_link, NET_SYSFS "%s/%s", ifname, file) < 0)
+        return -1;
+    return 0;
 }
 
 static int
@@ -1058,8 +1060,10 @@ virNetDevSysfsDeviceFile(char **pf_sysfs_device_link, const char *ifname,
                      const char *file)
 {
 
-    return virAsprintf(pf_sysfs_device_link, NET_SYSFS "%s/device/%s",
-                       ifname, file);
+    if (virAsprintf(pf_sysfs_device_link, NET_SYSFS "%s/device/%s", ifname,
+                    file) < 0)
+        return -1;
+    return 0;
 }
 
 /**
index c95c0e6326f846e65bb6a3db6f5ca8cf03fb5e6a..be50b4f9ac9b391576e96e86731a371965d28652 100644 (file)
@@ -194,7 +194,9 @@ virPCIDriverDir(char **buffer, const char *driver)
 {
     VIR_FREE(*buffer);
 
-    return virAsprintf(buffer, PCI_SYSFS "drivers/%s", driver);
+    if (virAsprintf(buffer, PCI_SYSFS "drivers/%s", driver) < 0)
+        return -1;
+    return 0;
 }
 
 
@@ -203,7 +205,9 @@ virPCIDriverFile(char **buffer, const char *driver, const char *file)
 {
     VIR_FREE(*buffer);
 
-    return virAsprintf(buffer, PCI_SYSFS "drivers/%s/%s", driver, file);
+    if (virAsprintf(buffer, PCI_SYSFS "drivers/%s/%s", driver, file) < 0)
+        return -1;
+    return 0;
 }
 
 
@@ -212,7 +216,9 @@ virPCIFile(char **buffer, const char *device, const char *file)
 {
     VIR_FREE(*buffer);
 
-    return virAsprintf(buffer, PCI_SYSFS "devices/%s/%s", device, file);
+    if (virAsprintf(buffer, PCI_SYSFS "devices/%s/%s", device, file) < 0)
+        return -1;
+    return 0;
 }
 
 
@@ -2529,17 +2535,21 @@ out:
 int
 virPCIGetSysfsFile(char *virPCIDeviceName, char **pci_sysfs_device_link)
 {
-    return virAsprintf(pci_sysfs_device_link, PCI_SYSFS "devices/%s",
-                       virPCIDeviceName);
+    if (virAsprintf(pci_sysfs_device_link, PCI_SYSFS "devices/%s",
+                    virPCIDeviceName) < 0)
+        return -1;
+    return 0;
 }
 
 int
 virPCIDeviceAddressGetSysfsFile(virPCIDeviceAddressPtr dev,
                                 char **pci_sysfs_device_link)
 {
-    return virAsprintf(pci_sysfs_device_link,
-                       PCI_SYSFS "devices/%04x:%02x:%02x.%x", dev->domain,
-                       dev->bus, dev->slot, dev->function);
+    if (virAsprintf(pci_sysfs_device_link,
+                    PCI_SYSFS "devices/%04x:%02x:%02x.%x", dev->domain,
+                    dev->bus, dev->slot, dev->function) < 0)
+        return -1;
+    return 0;
 }
 
 /*
index e2d18f8fed35b58b5763aa0672de6bddd4c40947..c2337321ce14b30cd60de7036daead828dfa049c 100644 (file)
@@ -178,6 +178,8 @@ virRandomGenerateWWN(char **wwn,
         return -1;
     }
 
-    return virAsprintf(wwn, "5" "%s%09llx", oui,
-                       (unsigned long long)virRandomBits(36));
+    if (virAsprintf(wwn, "5" "%s%09llx", oui,
+                    (unsigned long long)virRandomBits(36)) < 0)
+        return -1;
+    return 0;
 }
index 8b66b23fdc8b4907a1024e51acd3be8735418bd4..b39015005e253cab9f6f9fbda457bb27ad5c7e11 100644 (file)
@@ -176,7 +176,8 @@ size_t virStringListLength(char **strings);
  * Like glibc's vasprintf but makes sure *strp == NULL on failure, in which
  * case the OOM error is reported too.
  *
- * Returns -1 on failure (with OOM error reported), 0 on success.
+ * Returns -1 on failure (with OOM error reported), number of bytes printed
+ * on success.
  */
 # define virVasprintf(strp, fmt, list) \
     virVasprintfInternal(true, VIR_FROM_THIS, __FILE__, __FUNCTION__, \
@@ -187,7 +188,7 @@ size_t virStringListLength(char **strings);
  *
  * Like glibc's vasprintf but makes sure *strp == NULL on failure.
  *
- * Returns -1 on failure, 0 on success.
+ * Returns -1 on failure, number of bytes printed on success.
  */
 # define virVasprintfQuiet(strp, fmt, list) \
     virVasprintfInternal(false, 0, NULL, NULL, 0, strp, fmt, list)
@@ -200,7 +201,8 @@ size_t virStringListLength(char **strings);
  * Like glibc's_asprintf but makes sure *strp == NULL on failure, in which case
  * the OOM error is reported too.
  *
- * Returns -1 on failure (with OOM error reported), 0 on success.
+ * Returns -1 on failure (with OOM error reported), number of bytes printed
+ * on success.
  */
 
 # define virAsprintf(strp, ...) \
@@ -214,7 +216,7 @@ size_t virStringListLength(char **strings);
  *
  * Like glibc's_asprintf but makes sure *strp == NULL on failure.
  *
- * Returns -1 on failure, 0 on success.
+ * Returns -1 on failure, number of bytes printed on success.
  */
 
 # define virAsprintfQuiet(strp, ...) \
index 96f69b340764c695b5a7094b00a5a294a0df312c..ed99e592a856c6739b65fdb252de7b58e7e0d396 100644 (file)
@@ -313,9 +313,16 @@ error:
 int
 vmwareConstructVmxPath(char *directoryName, char *name, char **vmxPath)
 {
+    int ret;
+
     if (directoryName != NULL)
-        return virAsprintf(vmxPath, "%s/%s.vmx", directoryName, name);
-    return virAsprintf(vmxPath, "%s.vmx", name);
+        ret = virAsprintf(vmxPath, "%s/%s.vmx", directoryName, name);
+    else
+        ret = virAsprintf(vmxPath, "%s.vmx", name);
+
+    if (ret < 0)
+        return -1;
+    return 0;
 }
 
 int
@@ -414,7 +421,9 @@ vmwareMoveFile(char *srcFile, char *dstFile)
 int
 vmwareMakePath(char *srcDir, char *srcName, char *srcExt, char **outpath)
 {
-    return virAsprintf(outpath, "%s/%s.%s", srcDir, srcName, srcExt);
+    if (virAsprintf(outpath, "%s/%s.%s", srcDir, srcName, srcExt) < 0)
+        return -1;
+    return 0;
 }
 
 int
index 2430432f920be3fc9612ebc86c29c7cfa4a749e1..dd2c948d11413faf221f97044e7fc4f29041b95c 100644 (file)
@@ -18,7 +18,7 @@
 #define testError(...)                                          \
     do {                                                        \
         char *str;                                              \
-        if (virAsprintfQuiet(&str, __VA_ARGS__) == 0) {         \
+        if (virAsprintfQuiet(&str, __VA_ARGS__) >= 0) {         \
             fprintf(stderr, "%s", str);                         \
             VIR_FREE(str);                                      \
         }                                                       \