[libvirt] [PATCH 08/12] storage_conf: Improve the memory deallocation of virStorageVolDefParseXML

Osier Yang jyang at redhat.com
Wed May 22 12:05:18 UTC 2013


Changes:
  * Add a new goto label "error"
  * Free the strings at "cleanup"
  * Remove the unnecessary frees
---
 src/conf/storage_conf.c | 29 ++++++++++++++---------------
 1 file changed, 14 insertions(+), 15 deletions(-)

diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
index 6f0ed74..4c08cea 100644
--- a/src/conf/storage_conf.c
+++ b/src/conf/storage_conf.c
@@ -1253,7 +1253,7 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
     if (ret->name == NULL) {
         virReportError(VIR_ERR_XML_ERROR, "%s",
                        _("missing volume name element"));
-        goto cleanup;
+        goto error;
     }
 
     /* Auto-generated so deliberately ignore */
@@ -1264,20 +1264,17 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
     if (capacity == NULL) {
         virReportError(VIR_ERR_XML_ERROR, "%s",
                        _("missing capacity element"));
-        goto cleanup;
+        goto error;
     }
     if (virStorageSize(unit, capacity, &ret->capacity) < 0)
-        goto cleanup;
-    VIR_FREE(capacity);
+        goto error;
     VIR_FREE(unit);
 
     allocation = virXPathString("string(./allocation)", ctxt);
     if (allocation) {
         unit = virXPathString("string(./allocation/@unit)", ctxt);
         if (virStorageSize(unit, allocation, &ret->allocation) < 0)
-            goto cleanup;
-        VIR_FREE(allocation);
-        VIR_FREE(unit);
+            goto error;
     } else {
         ret->allocation = ret->capacity;
     }
@@ -1294,7 +1291,7 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
             virReportError(VIR_ERR_XML_ERROR,
                            _("unknown volume format type %s"), format);
             VIR_FREE(format);
-            goto cleanup;
+            goto error;
         }
         VIR_FREE(format);
     }
@@ -1302,14 +1299,14 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
     if (virStorageDefParsePerms(ctxt, &ret->target.perms,
                                 "./target/permissions",
                                 DEFAULT_VOL_PERM_MODE) < 0)
-        goto cleanup;
+        goto error;
 
     node = virXPathNode("./target/encryption", ctxt);
     if (node != NULL) {
         ret->target.encryption = virStorageEncryptionParseNode(ctxt->doc,
                                                                node);
         if (ret->target.encryption == NULL)
-            goto cleanup;
+            goto error;
     }
 
     ret->backingStore.path = virXPathString("string(./backingStore/path)", ctxt);
@@ -1324,7 +1321,7 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
             virReportError(VIR_ERR_XML_ERROR,
                            _("unknown volume format type %s"), format);
             VIR_FREE(format);
-            goto cleanup;
+            goto error;
         }
         VIR_FREE(format);
     }
@@ -1332,16 +1329,18 @@ virStorageVolDefParseXML(virStoragePoolDefPtr pool,
     if (virStorageDefParsePerms(ctxt, &ret->backingStore.perms,
                                 "./backingStore/permissions",
                                 DEFAULT_VOL_PERM_MODE) < 0)
-        goto cleanup;
-
-    return ret;
+        goto error;
 
 cleanup:
     VIR_FREE(allocation);
     VIR_FREE(capacity);
     VIR_FREE(unit);
+    return ret;
+
+error:
     virStorageVolDefFree(ret);
-    return NULL;
+    ret = NULL;
+    goto cleanup;
 }
 
 virStorageVolDefPtr
-- 
1.8.1.4




More information about the libvir-list mailing list