Some code paths already assume that it is allocated since it was always
allocated by virDomainPerfDefParseXML. Move allocation to
virDomainDefNew to handle cases that don't go through the XML parser.

This fixes crash when attempting to connect to an existing process via
virDomainQemuAttach.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1350688
---
 src/conf/domain_conf.c | 11 ++++-------
 1 file changed, 4 insertions(+), 7 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index ef266af..fb622cd 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -2746,6 +2746,9 @@ virDomainDefNew(void)
     if (!(ret->numa = virDomainNumaNew()))
         goto error;

+    if (VIR_ALLOC(ret->perf) < 0)
+        goto error;
+
     ret->mem.hard_limit = VIR_DOMAIN_MEMORY_PARAM_UNLIMITED;
     ret->mem.soft_limit = VIR_DOMAIN_MEMORY_PARAM_UNLIMITED;
     ret->mem.swap_hard_limit = VIR_DOMAIN_MEMORY_PARAM_UNLIMITED;
@@ -13136,9 +13139,6 @@ virDomainPerfDefParseXML(virDomainDefPtr def,
     if ((n = virXPathNodeSet("./perf/event", ctxt, &nodes)) < 0)
         return n;

-    if (VIR_ALLOC(def->perf) < 0)
-        goto cleanup;
-
     for (i = 0; i < n; i++) {
         if (virDomainPerfEventDefParseXML(def->perf, nodes[i]) < 0)
             goto cleanup;
@@ -13147,8 +13147,6 @@ virDomainPerfDefParseXML(virDomainDefPtr def,
     ret = 0;

  cleanup:
-    if (ret < 0)
-        VIR_FREE(def->perf);
     VIR_FREE(nodes);
     return ret;
 }
@@ -23388,8 +23386,7 @@ virDomainDefFormatInternal(virDomainDefPtr def,
         virBufferAddLit(buf, "</pm>\n");
     }

-    if (def->perf)
-        virDomainPerfDefFormat(buf, def->perf);
+    virDomainPerfDefFormat(buf, def->perf);

     virBufferAddLit(buf, "<devices>\n");
     virBufferAdjustIndent(buf, 2);
-- 
2.9.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to