]> xenbits.xensource.com Git - libvirt.git/commitdiff
storage_conf: Improve the memory deallocation of virStorageVolDefParseXML
authorOsier Yang <jyang@redhat.com>
Wed, 22 May 2013 12:05:18 +0000 (20:05 +0800)
committerOsier Yang <jyang@redhat.com>
Wed, 29 May 2013 10:05:55 +0000 (18:05 +0800)
Changes:
  * Add a new goto label "error"
  * Free the strings at "cleanup"
  * Remove the unnecessary frees

src/conf/storage_conf.c

index 97a7d4c68f90c786fe9a3f2d5eee69a3fd8ad972..4ccb791986d7eef5fe556575a53acb40a46f33c2 100644 (file)
@@ -1252,7 +1252,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 */
@@ -1263,20 +1263,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;
     }
@@ -1293,7 +1290,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);
     }
@@ -1301,14 +1298,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);
@@ -1323,7 +1320,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);
     }
@@ -1331,16 +1328,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