From 2689a922aa0d637e65f0296e05454918804fd2b0 Mon Sep 17 00:00:00 2001 From: John Ferlan Date: Mon, 26 Mar 2018 18:29:30 -0400 Subject: [PATCH] conf: Fix error path logic in virDomainObjListAddLocked If the virHashAddEntry fails, then we need to "careful" about how we free the @vm. When virDomainObjNew returns there is one reference and the object is locked, so use virDomainObjEndAPI when done. Add a virObjectRef in the error path for the second virHashAddEntry call since it doesn't call virObjectRef, but virHashRemoveEntry will call virObjectUnref because virObjectFreeHashData is called when the element is removed from the hash table as set up in virDomainObjListNew. Eventually these paths should goto error and error should be changed to use EndAPI as well, but that requires more adjustments to other paths in the code to have a locked and ref counted @vm. Signed-off-by: John Ferlan --- src/conf/virdomainobjlist.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/conf/virdomainobjlist.c b/src/conf/virdomainobjlist.c index 87a742b1ea..aa7966e364 100644 --- a/src/conf/virdomainobjlist.c +++ b/src/conf/virdomainobjlist.c @@ -296,12 +296,14 @@ virDomainObjListAddLocked(virDomainObjListPtr doms, virUUIDFormat(def->uuid, uuidstr); if (virHashAddEntry(doms->objs, uuidstr, vm) < 0) { - virObjectUnref(vm); + virDomainObjEndAPI(&vm); return NULL; } if (virHashAddEntry(doms->objsName, def->name, vm) < 0) { + virObjectRef(vm); virHashRemoveEntry(doms->objs, uuidstr); + virDomainObjEndAPI(&vm); return NULL; } -- 2.47.2