]> xenbits.xensource.com Git - libvirt.git/commitdiff
remote: Fix memory leak on error path when deserializing bulk stats
authorPeter Krempa <pkrempa@redhat.com>
Tue, 2 Sep 2014 13:16:47 +0000 (15:16 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 2 Sep 2014 13:16:47 +0000 (15:16 +0200)
The 'elem' variable along with the domain object would be leaked when
taking the error path.

Found by coverity.

src/remote/remote_driver.c

index fda27f7f649a0ec9d6d6287def615c98b1ccb336..8bc4baa98ab77ebda71f6bd9bb5558d8f99e56fa 100644 (file)
@@ -7730,7 +7730,7 @@ remoteConnectGetAllDomainStats(virConnectPtr conn,
     size_t i;
     remote_connect_get_all_domain_stats_args args;
     remote_connect_get_all_domain_stats_ret ret;
-
+    virDomainStatsRecordPtr elem = NULL;
     virDomainStatsRecordPtr *tmpret = NULL;
 
     if (ndoms) {
@@ -7769,7 +7769,6 @@ remoteConnectGetAllDomainStats(virConnectPtr conn,
         goto cleanup;
 
     for (i = 0; i < ret.retStats.retStats_len; i++) {
-        virDomainStatsRecordPtr elem;
         remote_domain_stats_record *rec = ret.retStats.retStats_val + i;
 
         if (VIR_ALLOC(elem) < 0)
@@ -7786,6 +7785,7 @@ remoteConnectGetAllDomainStats(virConnectPtr conn,
             goto cleanup;
 
         tmpret[i] = elem;
+        elem = NULL;
     }
 
     *retStats = tmpret;
@@ -7793,6 +7793,10 @@ remoteConnectGetAllDomainStats(virConnectPtr conn,
     rv = ret.retStats.retStats_len;
 
  cleanup:
+    if (elem) {
+        virObjectUnref(elem->dom);
+        VIR_FREE(elem);
+    }
     virDomainStatsRecordListFree(tmpret);
     xdr_free((xdrproc_t)xdr_remote_connect_get_all_domain_stats_ret,
              (char *) &ret);