]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
domain_conf.c: avoid a leak and the need for "cleanup:" block
authorJim Meyering <meyering@redhat.com>
Wed, 20 Jan 2010 18:27:43 +0000 (19:27 +0100)
committerJim Meyering <meyering@redhat.com>
Wed, 20 Jan 2010 20:46:30 +0000 (21:46 +0100)
* src/conf/domain_conf.c (virDomainChrDefFormat): Plug a leak on
an error path, and at the same time, eliminate the need for a
"cleanup:" block.  Before, the "return -1" after the switch
would leak an "addr" string.  Now, by reversing the port,addr-
getting blocks we can free "addr" immediately and skip the goto.

src/conf/domain_conf.c

index 6254dc85e48a202116ad8061f6b013c290771bf1..27f6f845a2a436f2fcc4081c434fbc07823150ac 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * domain_conf.c: domain XML processing
  *
- * Copyright (C) 2006-2009 Red Hat, Inc.
+ * Copyright (C) 2006-2010 Red Hat, Inc.
  * Copyright (C) 2006-2008 Daniel P. Berrange
  *
  * This library is free software; you can redistribute it and/or
@@ -4831,7 +4831,6 @@ virDomainChrDefFormat(virConnectPtr conn,
     const char *targetName = virDomainChrTargetTypeToString(def->targetType);
     const char *elementName;
 
-    const char *addr = NULL;
     int ret = 0;
 
     switch (def->targetType) {
@@ -4847,8 +4846,7 @@ virDomainChrDefFormat(virConnectPtr conn,
     if (!type) {
         virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR,
                              _("unexpected char type %d"), def->type);
-        ret = -1;
-        goto cleanup;
+        return -1;
     }
 
     /* Compat with legacy  <console tty='/dev/pts/5'/> syntax */
@@ -4931,23 +4929,25 @@ virDomainChrDefFormat(virConnectPtr conn,
 
     switch (def->targetType) {
     case VIR_DOMAIN_CHR_TARGET_TYPE_GUESTFWD:
-        addr = virSocketFormatAddr(def->target.addr);
-        if (addr == NULL) {
-            virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR, "%s",
-                                 _("Unable to format guestfwd address"));
-            ret = -1;
-            goto cleanup;
-        }
-        int port = virSocketGetPort(def->target.addr);
-        if (port < 0) {
-            virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR, "%s",
-                                 _("Unable to format guestfwd port"));
-            ret = -1;
-            goto cleanup;
+        {
+            int port = virSocketGetPort(def->target.addr);
+            if (port < 0) {
+                virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR, "%s",
+                                     _("Unable to format guestfwd port"));
+                return -1;
+            }
+            const char *addr = virSocketFormatAddr(def->target.addr);
+            if (addr == NULL) {
+                virDomainReportError(conn, VIR_ERR_INTERNAL_ERROR, "%s",
+                                     _("Unable to format guestfwd address"));
+                return -1;
+            }
+            virBufferVSprintf(buf,
+                    "      <target type='guestfwd' address='%s' port='%d'/>\n",
+                              addr, port);
+            VIR_FREE(addr);
+            break;
         }
-        virBufferVSprintf(buf, "      <target type='guestfwd' address='%s' port='%d'/>\n",
-                          addr, port);
-        break;
 
     case VIR_DOMAIN_CHR_TARGET_TYPE_PARALLEL:
     case VIR_DOMAIN_CHR_TARGET_TYPE_SERIAL:
@@ -4969,9 +4969,6 @@ virDomainChrDefFormat(virConnectPtr conn,
     virBufferVSprintf(buf, "    </%s>\n",
                       elementName);
 
-cleanup:
-    VIR_FREE(addr);
-
     return ret;
 }