]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
virNetDev{Replace,Restore}MacAddress: Fix memory leak
authorWangrui (K) <moon.wangrui@huawei.com>
Tue, 8 Apr 2014 04:25:31 +0000 (04:25 +0000)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 8 Apr 2014 08:51:53 +0000 (10:51 +0200)
Functions virNetDevRestoreMacAddress() and virNetDevRestoreMacAddress()
allocate memory for variable @path using virAsprintf(), but they
haven't freed that memory before returning out.

Signed-off-by: Zhang bo <oscar.zhangbo@huawei.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
src/util/virnetdev.c

index f26ea803f0e42bdeb3f18773ee5cda7450b61afa..3a60cf7c4380a63119e0b3f14b1e31d13404dd34 100644 (file)
@@ -310,11 +310,11 @@ virNetDevReplaceMacAddress(const char *linkdev,
     virMacAddr oldmac;
     char *path = NULL;
     char macstr[VIR_MAC_STRING_BUFLEN];
+    int ret = -1;
 
     if (virNetDevGetMAC(linkdev, &oldmac) < 0)
         return -1;
 
-
     if (virAsprintf(&path, "%s/%s",
                     stateDir,
                     linkdev) < 0)
@@ -323,13 +323,17 @@ virNetDevReplaceMacAddress(const char *linkdev,
     if (virFileWriteStr(path, macstr, O_CREAT|O_TRUNC|O_WRONLY) < 0) {
         virReportSystemError(errno, _("Unable to preserve mac for %s"),
                              linkdev);
-        return -1;
+        goto cleanup;
     }
 
     if (virNetDevSetMAC(linkdev, macaddress) < 0)
-        return -1;
+        goto cleanup;
 
-    return 0;
+    ret = 0;
+
+ cleanup:
+    VIR_FREE(path);
+    return ret;
 }
 
 /**
@@ -344,7 +348,7 @@ int
 virNetDevRestoreMacAddress(const char *linkdev,
                            const char *stateDir)
 {
-    int rc;
+    int rc = -1;
     char *oldmacname = NULL;
     char *macstr = NULL;
     char *path = NULL;
@@ -356,21 +360,22 @@ virNetDevRestoreMacAddress(const char *linkdev,
         return -1;
 
     if (virFileReadAll(path, VIR_MAC_STRING_BUFLEN, &macstr) < 0)
-        return -1;
+        goto cleanup;
 
     if (virMacAddrParse(macstr, &oldmac) != 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("Cannot parse MAC address from '%s'"),
                        oldmacname);
-        VIR_FREE(macstr);
-        return -1;
+        goto cleanup;
     }
 
     /*reset mac and remove file-ignore results*/
     rc = virNetDevSetMAC(linkdev, &oldmac);
     ignore_value(unlink(path));
-    VIR_FREE(macstr);
 
+ cleanup:
+    VIR_FREE(macstr);
+    VIR_FREE(path);
     return rc;
 }