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 <dionbosschie...@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)

Reply via email to