From 8a0711c758d56dd85d8436cda3b64c7799f8fe8e Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Sat, 27 Oct 2007 01:23:28 +0000 Subject: [PATCH] Avoiding calling remote network driver recursively if inside daemon --- ChangeLog | 6 ++++++ src/libvirt.c | 12 ++++++++---- src/remote_internal.c | 30 +++++++++++++++++++++++++++++- 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 44b9806350..331ded69e8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Fri Oct 26 21:20:44 EST 2007 Daniel P. Berrange + + * 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 * src/qemu_driver.c: Support CDROM media change for KVM/QEMU diff --git a/src/libvirt.c b/src/libvirt.c index d15588955c..fb95e96f27 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -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; diff --git a/src/remote_internal.c b/src/remote_internal.c index 96de52045e..3af326fd3a 100644 --- a/src/remote_internal.c +++ b/src/remote_internal.c @@ -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; }