[libvirt] [PATCH] build: avoid useless virAsprintf

Eric Blake eblake at redhat.com
Thu May 2 19:36:54 UTC 2013


virAsprintf(&foo, "%s", bar) is wasteful compared to
foo = strdup(bar) (or eventually, VIR_STRDUP(foo, bar),
but one thing at a time...).

Noticed while reviewing Laine's attempt to clean up broken
qemu:///session.

* cfg.mk (sc_prohibit_asprintf): Enhance rule.
* src/esx/esx_storage_backend_vmfs.c
(esxStorageBackendVMFSVolumeLookupByKey): Fix offender.
* src/network/bridge_driver.c (networkStateInitialize): Likewise.
* src/nwfilter/nwfilter_dhcpsnoop.c (virNWFilterSnoopDHCPOpen):
Likewise.
* src/storage/storage_backend_sheepdog.c
(virStorageBackendSheepdogRefreshVol): Likewise.
* src/util/vircgroup.c (virCgroupAddTaskStrController): Likewise.
* src/util/virdnsmasq.c (addnhostsAdd): Likewise.
* src/xen/block_stats.c (xenLinuxDomainDeviceID): Likewise.
* src/xen/xen_driver.c (xenUnifiedConnectOpen): Likewise.
* tools/virsh.c (vshGetTypedParamValue): Likewise.

Signed-off-by: Eric Blake <eblake at redhat.com>
---
 cfg.mk                                 | 4 ++++
 src/esx/esx_storage_backend_vmfs.c     | 5 ++---
 src/network/bridge_driver.c            | 9 +++------
 src/nwfilter/nwfilter_dhcpsnoop.c      | 4 ++--
 src/storage/storage_backend_sheepdog.c | 3 ++-
 src/util/vircgroup.c                   | 2 +-
 src/util/virdnsmasq.c                  | 7 ++++---
 src/xen/block_stats.c                  | 8 ++++----
 src/xen/xen_driver.c                   | 2 +-
 tools/virsh.c                          | 2 +-
 10 files changed, 24 insertions(+), 22 deletions(-)

diff --git a/cfg.mk b/cfg.mk
index d499ded..1d63bbd 100644
--- a/cfg.mk
+++ b/cfg.mk
@@ -378,10 +378,14 @@ sc_prohibit_strtol:
 	  $(_sc_search_regexp)

 # Use virAsprintf rather than as'printf since *strp is undefined on error.
+# But for plain %s, virAsprintf is overkill compared to strdup.
 sc_prohibit_asprintf:
 	@prohibit='\<v?a[s]printf\>'					\
 	halt='use virAsprintf, not as'printf				\
 	  $(_sc_search_regexp)
+	@prohibit='virAsprintf.*, *"%s",'				\
+	halt='use strdup instead of virAsprintf with "%s"'		\
+	  $(_sc_search_regexp)

 # Prefer virSetUIDGID.
 sc_prohibit_setuid:
diff --git a/src/esx/esx_storage_backend_vmfs.c b/src/esx/esx_storage_backend_vmfs.c
index dea6716..5d6f183 100644
--- a/src/esx/esx_storage_backend_vmfs.c
+++ b/src/esx/esx_storage_backend_vmfs.c
@@ -3,7 +3,7 @@
  * esx_storage_backend_vmfs.c: ESX storage driver backend for
  *                             managing VMFS datastores
  *
- * Copyright (C) 2010-2011 Red Hat, Inc.
+ * Copyright (C) 2010-2011, 2013 Red Hat, Inc.
  * Copyright (C) 2010-2012 Matthias Bolte <matthias.bolte at googlemail.com>
  * Copyright (C) 2012 Ata E Husain Bohra <ata.husain at hotmail.com>
  *
@@ -791,8 +791,7 @@ esxStorageBackendVMFSVolumeLookupByKey(virConnectPtr conn, const char *key)
                 VIR_FREE(datastorePath);

                 if (length < 1) {
-                    if (virAsprintf(&volumeName, "%s",
-                                    fileInfo->path) < 0) {
+                    if (!(volumeName = strdup(fileInfo->path))) {
                         virReportOOMError();
                         goto cleanup;
                     }
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index 35202f1..3ddea18 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -393,12 +393,9 @@ networkStateInitialize(bool privileged,
         }
         VIR_FREE(userdir);

-        userdir = virGetUserConfigDirectory();
-        if (virAsprintf(&base, "%s", userdir) == -1) {
-            VIR_FREE(userdir);
-            goto out_of_memory;
-        }
-        VIR_FREE(userdir);
+        base = virGetUserConfigDirectory();
+        if (!base)
+            goto error;
     }

     /* Configuration paths are either ~/.libvirt/qemu/... (session) or
diff --git a/src/nwfilter/nwfilter_dhcpsnoop.c b/src/nwfilter/nwfilter_dhcpsnoop.c
index df11e89..50042df 100644
--- a/src/nwfilter/nwfilter_dhcpsnoop.c
+++ b/src/nwfilter/nwfilter_dhcpsnoop.c
@@ -2,7 +2,7 @@
  * nwfilter_dhcpsnoop.c: support for DHCP snooping used by a VM
  *                       on an interface
  *
- * Copyright (C) 2012 Red Hat, Inc.
+ * Copyright (C) 2012-2013 Red Hat, Inc.
  * Copyright (C) 2011,2012 IBM Corp.
  *
  * Authors:
@@ -1110,7 +1110,7 @@ virNWFilterSnoopDHCPOpen(const char *ifname, virMacAddr *mac,
          * generate much more traffic than if we filtered by VM and
          * braodcast MAC as well
          */
-        if (virAsprintf(&ext_filter, "%s", filter) < 0) {
+        if (!(ext_filter = strdup(filter))) {
             virReportOOMError();
             return NULL;
         }
diff --git a/src/storage/storage_backend_sheepdog.c b/src/storage/storage_backend_sheepdog.c
index a9ee7d3..2e62e6d 100644
--- a/src/storage/storage_backend_sheepdog.c
+++ b/src/storage/storage_backend_sheepdog.c
@@ -1,6 +1,7 @@
 /*
  * storage_backend_sheepdog.c: storage backend for Sheepdog handling
  *
+ * Copyright (C) 2013 Red Hat, Inc.
  * Copyright (C) 2012 Wido den Hollander
  * Copyright (C) 2012 Frank Spijkerman
  * Copyright (C) 2012 Sebastian Wiedenroth
@@ -268,7 +269,7 @@ virStorageBackendSheepdogRefreshVol(virConnectPtr conn ATTRIBUTE_UNUSED,
     }

     VIR_FREE(vol->target.path);
-    if (virAsprintf(&vol->target.path, "%s", vol->name) == -1) {
+    if (!(vol->target.path = strdup(vol->name))) {
         virReportOOMError();
         goto cleanup;
     }
diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c
index b05fc45..473d2fc 100644
--- a/src/util/vircgroup.c
+++ b/src/util/vircgroup.c
@@ -1027,7 +1027,7 @@ static int virCgroupAddTaskStrController(virCgroupPtr group,
     int rc = 0;
     char *endp;

-    if (virAsprintf(&str, "%s", pidstr) < 0)
+    if (!(str = strdup(pidstr)))
         return -1;

     cur = str;
diff --git a/src/util/virdnsmasq.c b/src/util/virdnsmasq.c
index 4f05633..36f31d2 100644
--- a/src/util/virdnsmasq.c
+++ b/src/util/virdnsmasq.c
@@ -1,7 +1,7 @@
 /*
  * virdnsmasq.c: Helper APIs for managing dnsmasq
  *
- * Copyright (C) 2007-2012 Red Hat, Inc.
+ * Copyright (C) 2007-2013 Red Hat, Inc.
  * Copyright (C) 2010 Satoru SATOH <satoru.satoh at gmail.com>
  *
  * This library is free software; you can redistribute it and/or
@@ -118,7 +118,7 @@ addnhostsAdd(dnsmasqAddnHostsfile *addnhostsfile,
         if (VIR_ALLOC(addnhostsfile->hosts[idx].hostnames) < 0)
             goto alloc_error;

-        if (virAsprintf(&addnhostsfile->hosts[idx].ip, "%s", ipstr) < 0)
+        if (!(addnhostsfile->hosts[idx].ip = strdup(ipstr)))
             goto alloc_error;

         addnhostsfile->hosts[idx].nhostnames = 0;
@@ -128,7 +128,8 @@ addnhostsAdd(dnsmasqAddnHostsfile *addnhostsfile,
     if (VIR_REALLOC_N(addnhostsfile->hosts[idx].hostnames, addnhostsfile->hosts[idx].nhostnames + 1) < 0)
         goto alloc_error;

-    if (virAsprintf(&addnhostsfile->hosts[idx].hostnames[addnhostsfile->hosts[idx].nhostnames], "%s", name) < 0)
+    if (!(addnhostsfile->hosts[idx].hostnames[addnhostsfile->hosts[idx].nhostnames]
+          = strdup(name)))
         goto alloc_error;

     VIR_FREE(ipstr);
diff --git a/src/xen/block_stats.c b/src/xen/block_stats.c
index 8c18ed5..ded8d7f 100644
--- a/src/xen/block_stats.c
+++ b/src/xen/block_stats.c
@@ -1,7 +1,7 @@
 /*
  * Linux block and network stats.
  *
- * Copyright (C) 2007-2009 Red Hat, Inc.
+ * Copyright (C) 2007-2009, 2013 Red Hat, Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -293,11 +293,11 @@ xenLinuxDomainDeviceID(int domid, const char *path)
      */

     if (strlen(path) >= 5 && STRPREFIX(path, "/dev/"))
-        retval = virAsprintf(&mod_path, "%s", path);
+        mod_path = strdup(path);
     else
-        retval = virAsprintf(&mod_path, "/dev/%s", path);
+        ignore_value(virAsprintf(&mod_path, "/dev/%s", path));

-    if (retval < 0) {
+    if (!mod_path) {
         virReportOOMError();
         return -1;
     }
diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
index 938205e..6ad050c 100644
--- a/src/xen/xen_driver.c
+++ b/src/xen/xen_driver.c
@@ -443,7 +443,7 @@ xenUnifiedConnectOpen(virConnectPtr conn, virConnectAuthPtr auth, unsigned int f
     }
 #endif

-    if (virAsprintf(&priv->saveDir, "%s", XEN_SAVE_DIR) == -1) {
+    if (!(priv->saveDir = strdup(XEN_SAVE_DIR))) {
         virReportOOMError();
         goto fail;
     }
diff --git a/tools/virsh.c b/tools/virsh.c
index 22bcec2..7ef0bda 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -2181,7 +2181,7 @@ vshGetTypedParamValue(vshControl *ctl, virTypedParameterPtr item)
         break;

     case VIR_TYPED_PARAM_BOOLEAN:
-        ret = virAsprintf(&str, "%s", item->value.b ? _("yes") : _("no"));
+        str = vshStrdup(ctl, item->value.b ? _("yes") : _("no"));
         break;

     case VIR_TYPED_PARAM_STRING:
-- 
1.8.1.4




More information about the libvir-list mailing list