]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
snapshot: Improve logic of virDomainMomentMoveChildren
authorEric Blake <eblake@redhat.com>
Thu, 28 Mar 2019 14:00:59 +0000 (09:00 -0500)
committerEric Blake <eblake@redhat.com>
Thu, 28 Mar 2019 15:38:11 +0000 (10:38 -0500)
Even though Coverity can prove that 'last' is always set if the prior
loop executed, gcc 8.0.1 cannot:

  CC       conf/libvirt_conf_la-virdomainmomentobjlist.lo
../../src/conf/virdomainmomentobjlist.c: In function 'virDomainMomentMoveChildren':
../../src/conf/virdomainmomentobjlist.c:178:19: error: 'last' may be used uninitialized in this function [-Werror=maybe-uninitialized]
         last->sibling = to->first_child;
         ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~

Rewrite the loop to a form that should be easier for static analysis
to work with.

Fixes: ced0898f86bf
Reported-by: Bjoern Walk <bwalk@linux.ibm.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/conf/virdomainmomentobjlist.c

index b9ca5b1318f05444c4e61e5b951cfbc659c80e11..65e82f632cf0b9372a6c27368ce7025d2e862bb9 100644 (file)
@@ -164,18 +164,19 @@ void
 virDomainMomentMoveChildren(virDomainMomentObjPtr from,
                             virDomainMomentObjPtr to)
 {
-    virDomainMomentObjPtr child;
-    virDomainMomentObjPtr last;
+    virDomainMomentObjPtr child = from->first_child;
 
-    if (!from->first_child)
+    if (!from->nchildren)
         return;
-    for (child = from->first_child; child; child = child->sibling) {
+    while (child) {
         child->parent = to;
-        if (!child->sibling)
-            last = child;
+        if (!child->sibling) {
+            child->sibling = to->first_child;
+            break;
+        }
+        child = child->sibling;
     }
     to->nchildren += from->nchildren;
-    last->sibling = to->first_child;
     to->first_child = from->first_child;
     from->nchildren = 0;
     from->first_child = NULL;