43618d
From 1766db28533e2b5a96792aa0811e5364e0bb54d4 Mon Sep 17 00:00:00 2001
43618d
From: "Daniel P. Berrange" <berrange@redhat.com>
43618d
Date: Thu, 3 Oct 2013 14:07:00 +0100
43618d
Subject: [PATCH] Remove use of virConnectPtr from all remaining nwfilter code
43618d
43618d
The virConnectPtr is passed around loads of nwfilter code in
43618d
order to provide it as a parameter to the callback registered
43618d
by the virt drivers. None of the virt drivers use this param
43618d
though, so it serves no purpose.
43618d
43618d
Avoiding the need to pass a virConnectPtr means that the
43618d
nwfilterStateReload method no longer needs to open a bogus
43618d
QEMU driver connection. This addresses a race condition that
43618d
can lead to a crash on startup.
43618d
43618d
The nwfilter driver starts before the QEMU driver and registers
43618d
some callbacks with DBus to detect firewalld reload. If the
43618d
firewalld reload happens while the QEMU driver is still starting
43618d
up though, the nwfilterStateReload method will open a connection
43618d
to the partially initialized QEMU driver and cause a crash.
43618d
43618d
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
43618d
---
43618d
 src/conf/nwfilter_conf.c       | 49 ++++++++++++++++--------------------------
43618d
 src/conf/nwfilter_conf.h       | 14 +++++-------
43618d
 src/lxc/lxc_driver.c           |  3 +--
43618d
 src/nwfilter/nwfilter_driver.c | 42 ++++++++++++++----------------------
43618d
 src/qemu/qemu_driver.c         |  3 +--
43618d
 src/uml/uml_driver.c           |  3 +--
43618d
 6 files changed, 43 insertions(+), 71 deletions(-)
43618d
43618d
diff --git a/src/conf/nwfilter_conf.c b/src/conf/nwfilter_conf.c
43618d
index 9927f7e..7152aae 100644
43618d
--- a/src/conf/nwfilter_conf.c
43618d
+++ b/src/conf/nwfilter_conf.c
43618d
@@ -2744,8 +2744,7 @@ cleanup:
43618d
 
43618d
 
43618d
 static int
43618d
-_virNWFilterDefLoopDetect(virConnectPtr conn,
43618d
-                          virNWFilterObjListPtr nwfilters,
43618d
+_virNWFilterDefLoopDetect(virNWFilterObjListPtr nwfilters,
43618d
                           virNWFilterDefPtr def,
43618d
                           const char *filtername)
43618d
 {
43618d
@@ -2769,7 +2768,7 @@ _virNWFilterDefLoopDetect(virConnectPtr conn,
43618d
             obj = virNWFilterObjFindByName(nwfilters,
43618d
                                            entry->include->filterref);
43618d
             if (obj) {
43618d
-                rc = _virNWFilterDefLoopDetect(conn, nwfilters,
43618d
+                rc = _virNWFilterDefLoopDetect(nwfilters,
43618d
                                                obj->def, filtername);
43618d
 
43618d
                 virNWFilterObjUnlock(obj);
43618d
@@ -2785,7 +2784,6 @@ _virNWFilterDefLoopDetect(virConnectPtr conn,
43618d
 
43618d
 /*
43618d
  * virNWFilterDefLoopDetect:
43618d
- * @conn: pointer to virConnect object
43618d
  * @nwfilters : the nwfilters to search
43618d
  * @def : the filter definition that may add a loop and is to be tested
43618d
  *
43618d
@@ -2795,11 +2793,10 @@ _virNWFilterDefLoopDetect(virConnectPtr conn,
43618d
  * Returns 0 in case no loop was detected, -1 otherwise.
43618d
  */
43618d
 static int
43618d
-virNWFilterDefLoopDetect(virConnectPtr conn,
43618d
-                         virNWFilterObjListPtr nwfilters,
43618d
+virNWFilterDefLoopDetect(virNWFilterObjListPtr nwfilters,
43618d
                          virNWFilterDefPtr def)
43618d
 {
43618d
-    return _virNWFilterDefLoopDetect(conn, nwfilters, def, def->name);
43618d
+    return _virNWFilterDefLoopDetect(nwfilters, def, def->name);
43618d
 }
43618d
 
43618d
 int nCallbackDriver;
43618d
@@ -2858,7 +2855,7 @@ static void *virNWFilterDomainFWUpdateOpaque;
43618d
  * error. This should be called upon reloading of the driver.
43618d
  */
43618d
 int
43618d
-virNWFilterInstFiltersOnAllVMs(virConnectPtr conn)
43618d
+virNWFilterInstFiltersOnAllVMs(void)
43618d
 {
43618d
     size_t i;
43618d
     struct domUpdateCBStruct cb = {
43618d
@@ -2868,15 +2865,14 @@ virNWFilterInstFiltersOnAllVMs(virConnectPtr conn)
43618d
     };
43618d
 
43618d
     for (i = 0; i < nCallbackDriver; i++)
43618d
-        callbackDrvArray[i]->vmFilterRebuild(conn,
43618d
-                                             virNWFilterDomainFWUpdateCB,
43618d
+        callbackDrvArray[i]->vmFilterRebuild(virNWFilterDomainFWUpdateCB,
43618d
                                              &cb;;
43618d
 
43618d
     return 0;
43618d
 }
43618d
 
43618d
 static int
43618d
-virNWFilterTriggerVMFilterRebuild(virConnectPtr conn)
43618d
+virNWFilterTriggerVMFilterRebuild(void)
43618d
 {
43618d
     size_t i;
43618d
     int ret = 0;
43618d
@@ -2890,8 +2886,7 @@ virNWFilterTriggerVMFilterRebuild(virConnectPtr conn)
43618d
         return -1;
43618d
 
43618d
     for (i = 0; i < nCallbackDriver; i++) {
43618d
-        if (callbackDrvArray[i]->vmFilterRebuild(conn,
43618d
-                                                 virNWFilterDomainFWUpdateCB,
43618d
+        if (callbackDrvArray[i]->vmFilterRebuild(virNWFilterDomainFWUpdateCB,
43618d
                                                  &cb) < 0)
43618d
             ret = -1;
43618d
     }
43618d
@@ -2900,15 +2895,13 @@ virNWFilterTriggerVMFilterRebuild(virConnectPtr conn)
43618d
         cb.step = STEP_TEAR_NEW; /* rollback */
43618d
 
43618d
         for (i = 0; i < nCallbackDriver; i++)
43618d
-            callbackDrvArray[i]->vmFilterRebuild(conn,
43618d
-                                                 virNWFilterDomainFWUpdateCB,
43618d
+            callbackDrvArray[i]->vmFilterRebuild(virNWFilterDomainFWUpdateCB,
43618d
                                                  &cb;;
43618d
     } else {
43618d
         cb.step = STEP_TEAR_OLD; /* switch over */
43618d
 
43618d
         for (i = 0; i < nCallbackDriver; i++)
43618d
-            callbackDrvArray[i]->vmFilterRebuild(conn,
43618d
-                                                 virNWFilterDomainFWUpdateCB,
43618d
+            callbackDrvArray[i]->vmFilterRebuild(virNWFilterDomainFWUpdateCB,
43618d
                                                  &cb;;
43618d
     }
43618d
 
43618d
@@ -2919,14 +2912,13 @@ virNWFilterTriggerVMFilterRebuild(virConnectPtr conn)
43618d
 
43618d
 
43618d
 int
43618d
-virNWFilterTestUnassignDef(virConnectPtr conn,
43618d
-                           virNWFilterObjPtr nwfilter)
43618d
+virNWFilterTestUnassignDef(virNWFilterObjPtr nwfilter)
43618d
 {
43618d
     int rc = 0;
43618d
 
43618d
     nwfilter->wantRemoved = 1;
43618d
     /* trigger the update on VMs referencing the filter */
43618d
-    if (virNWFilterTriggerVMFilterRebuild(conn))
43618d
+    if (virNWFilterTriggerVMFilterRebuild())
43618d
         rc = -1;
43618d
 
43618d
     nwfilter->wantRemoved = 0;
43618d
@@ -2965,8 +2957,7 @@ cleanup:
43618d
 }
43618d
 
43618d
 virNWFilterObjPtr
43618d
-virNWFilterObjAssignDef(virConnectPtr conn,
43618d
-                        virNWFilterObjListPtr nwfilters,
43618d
+virNWFilterObjAssignDef(virNWFilterObjListPtr nwfilters,
43618d
                         virNWFilterDefPtr def)
43618d
 {
43618d
     virNWFilterObjPtr nwfilter;
43618d
@@ -2985,7 +2976,7 @@ virNWFilterObjAssignDef(virConnectPtr conn,
43618d
         virNWFilterObjUnlock(nwfilter);
43618d
     }
43618d
 
43618d
-    if (virNWFilterDefLoopDetect(conn, nwfilters, def) < 0) {
43618d
+    if (virNWFilterDefLoopDetect(nwfilters, def) < 0) {
43618d
         virReportError(VIR_ERR_OPERATION_FAILED,
43618d
                        "%s", _("filter would introduce a loop"));
43618d
         return NULL;
43618d
@@ -3004,7 +2995,7 @@ virNWFilterObjAssignDef(virConnectPtr conn,
43618d
 
43618d
         nwfilter->newDef = def;
43618d
         /* trigger the update on VMs referencing the filter */
43618d
-        if (virNWFilterTriggerVMFilterRebuild(conn)) {
43618d
+        if (virNWFilterTriggerVMFilterRebuild()) {
43618d
             nwfilter->newDef = NULL;
43618d
             virNWFilterUnlockFilterUpdates();
43618d
             virNWFilterObjUnlock(nwfilter);
43618d
@@ -3046,8 +3037,7 @@ virNWFilterObjAssignDef(virConnectPtr conn,
43618d
 
43618d
 
43618d
 static virNWFilterObjPtr
43618d
-virNWFilterObjLoad(virConnectPtr conn,
43618d
-                   virNWFilterObjListPtr nwfilters,
43618d
+virNWFilterObjLoad(virNWFilterObjListPtr nwfilters,
43618d
                    const char *file,
43618d
                    const char *path)
43618d
 {
43618d
@@ -3066,7 +3056,7 @@ virNWFilterObjLoad(virConnectPtr conn,
43618d
         return NULL;
43618d
     }
43618d
 
43618d
-    if (!(nwfilter = virNWFilterObjAssignDef(conn, nwfilters, def))) {
43618d
+    if (!(nwfilter = virNWFilterObjAssignDef(nwfilters, def))) {
43618d
         virNWFilterDefFree(def);
43618d
         return NULL;
43618d
     }
43618d
@@ -3082,8 +3072,7 @@ virNWFilterObjLoad(virConnectPtr conn,
43618d
 
43618d
 
43618d
 int
43618d
-virNWFilterLoadAllConfigs(virConnectPtr conn,
43618d
-                          virNWFilterObjListPtr nwfilters,
43618d
+virNWFilterLoadAllConfigs(virNWFilterObjListPtr nwfilters,
43618d
                           const char *configDir)
43618d
 {
43618d
     DIR *dir;
43618d
@@ -3111,7 +3100,7 @@ virNWFilterLoadAllConfigs(virConnectPtr conn,
43618d
         if (!(path = virFileBuildPath(configDir, entry->d_name, NULL)))
43618d
             continue;
43618d
 
43618d
-        nwfilter = virNWFilterObjLoad(conn, nwfilters, entry->d_name, path);
43618d
+        nwfilter = virNWFilterObjLoad(nwfilters, entry->d_name, path);
43618d
         if (nwfilter)
43618d
             virNWFilterObjUnlock(nwfilter);
43618d
 
43618d
diff --git a/src/conf/nwfilter_conf.h b/src/conf/nwfilter_conf.h
43618d
index e470615..29906f1 100644
43618d
--- a/src/conf/nwfilter_conf.h
43618d
+++ b/src/conf/nwfilter_conf.h
43618d
@@ -687,12 +687,10 @@ int virNWFilterObjSaveDef(virNWFilterDriverStatePtr driver,
43618d
 
43618d
 int virNWFilterObjDeleteDef(virNWFilterObjPtr nwfilter);
43618d
 
43618d
-virNWFilterObjPtr virNWFilterObjAssignDef(virConnectPtr conn,
43618d
-                                          virNWFilterObjListPtr nwfilters,
43618d
+virNWFilterObjPtr virNWFilterObjAssignDef(virNWFilterObjListPtr nwfilters,
43618d
                                           virNWFilterDefPtr def);
43618d
 
43618d
-int virNWFilterTestUnassignDef(virConnectPtr conn,
43618d
-                               virNWFilterObjPtr nwfilter);
43618d
+int virNWFilterTestUnassignDef(virNWFilterObjPtr nwfilter);
43618d
 
43618d
 virNWFilterDefPtr virNWFilterDefParseNode(xmlDocPtr xml,
43618d
                                           xmlNodePtr root);
43618d
@@ -706,8 +704,7 @@ int virNWFilterSaveXML(const char *configDir,
43618d
 int virNWFilterSaveConfig(const char *configDir,
43618d
                           virNWFilterDefPtr def);
43618d
 
43618d
-int virNWFilterLoadAllConfigs(virConnectPtr conn,
43618d
-                              virNWFilterObjListPtr nwfilters,
43618d
+int virNWFilterLoadAllConfigs(virNWFilterObjListPtr nwfilters,
43618d
                               const char *configDir);
43618d
 
43618d
 char *virNWFilterConfigFile(const char *dir,
43618d
@@ -725,11 +722,10 @@ void virNWFilterUnlockFilterUpdates(void);
43618d
 int virNWFilterConfLayerInit(virDomainObjListIterator domUpdateCB, void *opaque);
43618d
 void virNWFilterConfLayerShutdown(void);
43618d
 
43618d
-int virNWFilterInstFiltersOnAllVMs(virConnectPtr conn);
43618d
+int virNWFilterInstFiltersOnAllVMs(void);
43618d
 
43618d
 
43618d
-typedef int (*virNWFilterRebuild)(virConnectPtr conn,
43618d
-                                  virDomainObjListIterator domUpdateCB,
43618d
+typedef int (*virNWFilterRebuild)(virDomainObjListIterator domUpdateCB,
43618d
                                   void *data);
43618d
 typedef void (*virNWFilterVoidCall)(void);
43618d
 
43618d
diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
43618d
index 8b13f84..e3a34d6 100644
43618d
--- a/src/lxc/lxc_driver.c
43618d
+++ b/src/lxc/lxc_driver.c
43618d
@@ -84,8 +84,7 @@ virLXCDriverPtr lxc_driver = NULL;
43618d
 
43618d
 /* callbacks for nwfilter */
43618d
 static int
43618d
-lxcVMFilterRebuild(virConnectPtr conn ATTRIBUTE_UNUSED,
43618d
-                   virDomainObjListIterator iter, void *data)
43618d
+lxcVMFilterRebuild(virDomainObjListIterator iter, void *data)
43618d
 {
43618d
     return virDomainObjListForEach(lxc_driver->domains, iter, data);
43618d
 }
43618d
diff --git a/src/nwfilter/nwfilter_driver.c b/src/nwfilter/nwfilter_driver.c
43618d
index 6e20e03..d25c6f2 100644
43618d
--- a/src/nwfilter/nwfilter_driver.c
43618d
+++ b/src/nwfilter/nwfilter_driver.c
43618d
@@ -235,8 +235,7 @@ nwfilterStateInitialize(bool privileged,
43618d
 
43618d
     VIR_FREE(base);
43618d
 
43618d
-    if (virNWFilterLoadAllConfigs(NULL,
43618d
-                                  &driverState->nwfilters,
43618d
+    if (virNWFilterLoadAllConfigs(&driverState->nwfilters,
43618d
                                   driverState->configDir) < 0)
43618d
         goto error;
43618d
 
43618d
@@ -272,37 +271,28 @@ err_free_driverstate:
43618d
  * files and update its state
43618d
  */
43618d
 static int
43618d
-nwfilterStateReload(void) {
43618d
-    virConnectPtr conn;
43618d
-
43618d
-    if (!driverState) {
43618d
+nwfilterStateReload(void)
43618d
+{
43618d
+    if (!driverState)
43618d
         return -1;
43618d
-    }
43618d
 
43618d
     if (!driverState->privileged)
43618d
         return 0;
43618d
 
43618d
-    conn = virConnectOpen("qemu:///system");
43618d
-
43618d
-    if (conn) {
43618d
-        virNWFilterDHCPSnoopEnd(NULL);
43618d
-        /* shut down all threads -- they will be restarted if necessary */
43618d
-        virNWFilterLearnThreadsTerminate(true);
43618d
-
43618d
-        nwfilterDriverLock(driverState);
43618d
-        virNWFilterCallbackDriversLock();
43618d
+    virNWFilterDHCPSnoopEnd(NULL);
43618d
+    /* shut down all threads -- they will be restarted if necessary */
43618d
+    virNWFilterLearnThreadsTerminate(true);
43618d
 
43618d
-        virNWFilterLoadAllConfigs(conn,
43618d
-                                  &driverState->nwfilters,
43618d
-                                  driverState->configDir);
43618d
+    nwfilterDriverLock(driverState);
43618d
+    virNWFilterCallbackDriversLock();
43618d
 
43618d
-        virNWFilterCallbackDriversUnlock();
43618d
-        nwfilterDriverUnlock(driverState);
43618d
+    virNWFilterLoadAllConfigs(&driverState->nwfilters,
43618d
+                              driverState->configDir);
43618d
 
43618d
-        virNWFilterInstFiltersOnAllVMs(conn);
43618d
+    virNWFilterCallbackDriversUnlock();
43618d
+    nwfilterDriverUnlock(driverState);
43618d
 
43618d
-        virConnectClose(conn);
43618d
-    }
43618d
+    virNWFilterInstFiltersOnAllVMs();
43618d
 
43618d
     return 0;
43618d
 }
43618d
@@ -573,7 +563,7 @@ nwfilterDefineXML(virConnectPtr conn,
43618d
     if (virNWFilterDefineXMLEnsureACL(conn, def) < 0)
43618d
         goto cleanup;
43618d
 
43618d
-    if (!(nwfilter = virNWFilterObjAssignDef(conn, &driver->nwfilters, def)))
43618d
+    if (!(nwfilter = virNWFilterObjAssignDef(&driver->nwfilters, def)))
43618d
         goto cleanup;
43618d
 
43618d
     if (virNWFilterObjSaveDef(driver, nwfilter, def) < 0) {
43618d
@@ -617,7 +607,7 @@ nwfilterUndefine(virNWFilterPtr obj) {
43618d
     if (virNWFilterUndefineEnsureACL(obj->conn, nwfilter->def) < 0)
43618d
         goto cleanup;
43618d
 
43618d
-    if (virNWFilterTestUnassignDef(obj->conn, nwfilter) < 0) {
43618d
+    if (virNWFilterTestUnassignDef(nwfilter) < 0) {
43618d
         virReportError(VIR_ERR_OPERATION_INVALID,
43618d
                        "%s",
43618d
                        _("nwfilter is in use"));
43618d
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
43618d
index e8bc04d..068d29f 100644
43618d
--- a/src/qemu/qemu_driver.c
43618d
+++ b/src/qemu/qemu_driver.c
43618d
@@ -177,8 +177,7 @@ static void
43618d
 qemuVMDriverUnlock(void) {}
43618d
 
43618d
 static int
43618d
-qemuVMFilterRebuild(virConnectPtr conn ATTRIBUTE_UNUSED,
43618d
-                    virDomainObjListIterator iter, void *data)
43618d
+qemuVMFilterRebuild(virDomainObjListIterator iter, void *data)
43618d
 {
43618d
     return virDomainObjListForEach(qemu_driver->domains, iter, data);
43618d
 }
43618d
diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c
43618d
index 9ca352f..eb02542 100644
43618d
--- a/src/uml/uml_driver.c
43618d
+++ b/src/uml/uml_driver.c
43618d
@@ -148,8 +148,7 @@ static int umlMonitorCommand(const struct uml_driver *driver,
43618d
 static struct uml_driver *uml_driver = NULL;
43618d
 
43618d
 static int
43618d
-umlVMFilterRebuild(virConnectPtr conn ATTRIBUTE_UNUSED,
43618d
-                   virDomainObjListIterator iter, void *data)
43618d
+umlVMFilterRebuild(virDomainObjListIterator iter, void *data)
43618d
 {
43618d
     return virDomainObjListForEach(uml_driver->domains, iter, data);
43618d
 }