A deadlock occurs when `nwfilterBindingCreateXML` and `nwfilterConnectListAllNWFilters`
acquire locks in an inconsistent order. This patch ensures `nwfilterBindingCreateXML`
acquires `driverMutex` before `updateLock`, resolving the issue.
Additionally, added `driverMutex` to `nwfilterBindingDelete` to maintain consistent
locking order.
Signed-off-by: Dion Bosschieter <dionbosschieter(a)gmail.com>
---
src/nwfilter/nwfilter_driver.c | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/src/nwfilter/nwfilter_driver.c b/src/nwfilter/nwfilter_driver.c
index 8ece91bf7c..58e9fcfd51 100644
--- a/src/nwfilter/nwfilter_driver.c
+++ b/src/nwfilter/nwfilter_driver.c
@@ -754,11 +754,13 @@ nwfilterBindingCreateXML(virConnectPtr conn,
if (!(ret = virGetNWFilterBinding(conn, def->portdevname, def->filter)))
goto cleanup;
- VIR_WITH_MUTEX_LOCK_GUARD(&driver->updateLock) {
- if (virNWFilterInstantiateFilter(driver, def) < 0) {
- virNWFilterBindingObjListRemove(driver->bindings, obj);
- g_clear_pointer(&ret, virObjectUnref);
- goto cleanup;
+ VIR_WITH_MUTEX_LOCK_GUARD(&driverMutex) {
+ VIR_WITH_MUTEX_LOCK_GUARD(&driver->updateLock) {
+ if (virNWFilterInstantiateFilter(driver, def) < 0) {
+ virNWFilterBindingObjListRemove(driver->bindings, obj);
+ g_clear_pointer(&ret, virObjectUnref);
+ goto cleanup;
+ }
}
}
@@ -783,6 +785,7 @@ nwfilterBindingCreateXML(virConnectPtr conn,
static int
nwfilterBindingDelete(virNWFilterBindingPtr binding)
{
+ VIR_LOCK_GUARD lock = virLockGuardLock(&driverMutex);
virNWFilterBindingObj *obj;
virNWFilterBindingDef *def;
int ret = -1;
--
2.39.3 (Apple Git-146)