]> xenbits.xensource.com Git - libvirt.git/commitdiff
tests: fix double unlock of monitor in hotplug test
authorDaniel P. Berrangé <berrange@redhat.com>
Thu, 12 Mar 2020 18:33:51 +0000 (18:33 +0000)
committerDaniel P. Berrangé <berrange@redhat.com>
Fri, 13 Mar 2020 11:27:57 +0000 (11:27 +0000)
The qemuMonitorTestNew() function returns with the monitor object
locked, and expects it to still be locked when qemuMonitorTestFree
is called.  The qemuhotplug test, however, explicitly unlocks the
monitor, but then forgets to lock it again. As a result the
qemuMonitorTestFree function is unlocking a mutex it doesn't own.

This bug has existed forever, but since we use normal POSIX mutexes
and don't check the return value of pthread_mutex_lock/unlock we
didn't see the error. It was harmless until the switch to the per
monitor event loop which requires the thread synchronization to
work reliably, whereupon it started crashing.

Reviewed-by: Peter Krempa <pkrempa@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
tests/qemuhotplugtest.c

index 8b411d63f0d1ae48df3e60fcad45753aacf5f9f8..d9244dca4422b5105b4a5097c0eefcdca4ff7fbf 100644 (file)
@@ -337,6 +337,8 @@ testQemuHotplug(const void *data)
         ret = testQemuHotplugUpdate(vm, dev);
     }
 
+    virObjectLock(priv->mon);
+
  cleanup:
     VIR_FREE(domain_filename);
     VIR_FREE(device_filename);
@@ -378,6 +380,7 @@ static void
 testQemuHotplugCpuDataFree(struct testQemuHotplugCpuData *data)
 {
     qemuDomainObjPrivatePtr priv;
+    qemuMonitorPtr mon;
 
     if (!data)
         return;
@@ -396,6 +399,8 @@ testQemuHotplugCpuDataFree(struct testQemuHotplugCpuData *data)
         virObjectUnref(data->vm);
     }
 
+    mon = qemuMonitorTestGetMonitor(data->mon);
+    virObjectLock(mon);
     qemuMonitorTestFree(data->mon);
     VIR_FREE(data);
 }