]> xenbits.xensource.com Git - libvirt.git/commitdiff
Avoiding calling remote network driver recursively if inside daemon
authorDaniel P. Berrange <berrange@redhat.com>
Sat, 27 Oct 2007 01:23:28 +0000 (01:23 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Sat, 27 Oct 2007 01:23:28 +0000 (01:23 +0000)
ChangeLog
src/libvirt.c
src/remote_internal.c

index 44b98063502db708f057d3d767fd6e21faf5bf93..331ded69e869ddfb0182302ab8db0d77cb6c1b27 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Fri Oct 26 21:20:44 EST 2007 Daniel P. Berrange <berrange@redhat.com>
+
+       * src/libvirt.c: Don't call state driver API if callback is NULL.
+       * src/remote_internal.c: Reject open attempts if inside the daemon
+       to avoid recursively calling self.
+
 Fri Oct 26 21:18:44 EST 2007 Daniel P. Berrange <berrange@redhat.com>
 
        * src/qemu_driver.c: Support CDROM media change for KVM/QEMU
index d15588955c8702c96b1a4d797984889d8210f58c..fb95e96f2724d84c4a51a52c672f99bce90936a3 100644 (file)
@@ -302,7 +302,8 @@ int __virStateInitialize(void) {
         return -1;
 
     for (i = 0 ; i < virStateDriverTabCount ; i++) {
-        if (virStateDriverTab[i]->initialize() < 0)
+        if (virStateDriverTab[i]->initialize &&
+            virStateDriverTab[i]->initialize() < 0)
             ret = -1;
     }
     return ret;
@@ -312,7 +313,8 @@ int __virStateCleanup(void) {
     int i, ret = 0;
 
     for (i = 0 ; i < virStateDriverTabCount ; i++) {
-        if (virStateDriverTab[i]->cleanup() < 0)
+        if (virStateDriverTab[i]->cleanup &&
+            virStateDriverTab[i]->cleanup() < 0)
             ret = -1;
     }
     return ret;
@@ -322,7 +324,8 @@ int __virStateReload(void) {
     int i, ret = 0;
 
     for (i = 0 ; i < virStateDriverTabCount ; i++) {
-        if (virStateDriverTab[i]->reload() < 0)
+        if (virStateDriverTab[i]->reload &&
+            virStateDriverTab[i]->reload() < 0)
             ret = -1;
     }
     return ret;
@@ -332,7 +335,8 @@ int __virStateActive(void) {
     int i, ret = 0;
 
     for (i = 0 ; i < virStateDriverTabCount ; i++) {
-        if (virStateDriverTab[i]->active())
+        if (virStateDriverTab[i]->active &&
+            virStateDriverTab[i]->active())
             ret = 1;
     }
     return ret;
index 96de52045ef0eb46852ae2a31067125dee30bcd2..3af326fd3a49ea3b5ad87b91a18b816bbc87777e 100644 (file)
@@ -59,6 +59,8 @@
 #define MAGIC 999               /* private_data->magic if OK */
 #define DEAD 998                /* private_data->magic if dead/closed */
 
+static int inside_daemon = 0;
+
 struct private_data {
     int magic;                  /* Should be MAGIC or DEAD. */
     int sock;                   /* Socket. */
@@ -120,6 +122,16 @@ static void query_free (struct query_fields *fields);
 static int initialise_gnutls (virConnectPtr conn);
 static gnutls_session_t negotiate_gnutls_on_connection (virConnectPtr conn, int sock, int no_verify, const char *hostname);
 
+static int
+remoteStartup(void)
+{
+    /* Mark that we're inside the daemon so we can avoid
+     * re-entering ourselves
+     */
+    inside_daemon = 1;
+    return 0;
+}
+
 /**
  * remoteFindServerPath:
  *
@@ -695,9 +707,13 @@ doRemoteOpen (virConnectPtr conn, struct private_data *priv, const char *uri_str
 static int
 remoteOpen (virConnectPtr conn, const char *uri_str, int flags)
 {
-    struct private_data *priv = malloc (sizeof(struct private_data));
+    struct private_data *priv;
     int ret, rflags = 0;
 
+    if (inside_daemon)
+        return VIR_DRV_OPEN_DECLINED;
+
+    priv = malloc (sizeof(struct private_data));
     if (!priv) {
         error (NULL, VIR_ERR_NO_MEMORY, "struct private_data");
         return VIR_DRV_OPEN_ERROR;
@@ -2361,6 +2377,9 @@ remoteNetworkOpen (virConnectPtr conn,
                    const char *uri_str,
                    int flags)
 {
+    if (inside_daemon)
+        return VIR_DRV_OPEN_DECLINED;
+
     if (conn &&
         conn->driver &&
         strcmp (conn->driver->name, "remote") == 0) {
@@ -3174,6 +3193,14 @@ static virNetworkDriver network_driver = {
     .networkSetAutostart = remoteNetworkSetAutostart,
 };
 
+static virStateDriver state_driver = {
+    remoteStartup,
+    NULL,
+    NULL,
+    NULL,
+};
+
+
 /** remoteRegister:
  *
  * Register driver with libvirt driver system.
@@ -3185,6 +3212,7 @@ remoteRegister (void)
 {
     if (virRegisterDriver (&driver) == -1) return -1;
     if (virRegisterNetworkDriver (&network_driver) == -1) return -1;
+    if (virRegisterStateDriver (&state_driver) == -1) return -1;
 
     return 0;
 }