aboutsummaryrefslogtreecommitdiffstats
path: root/src/charon/control
diff options
context:
space:
mode:
Diffstat (limited to 'src/charon/control')
-rw-r--r--src/charon/control/interface_manager.c15
-rw-r--r--src/charon/control/interface_manager.h8
-rw-r--r--src/charon/control/interfaces/dbus_interface.c6
-rwxr-xr-xsrc/charon/control/interfaces/stroke_interface.c2
4 files changed, 27 insertions, 4 deletions
diff --git a/src/charon/control/interface_manager.c b/src/charon/control/interface_manager.c
index 8d9bdb6ee..8cae621dd 100644
--- a/src/charon/control/interface_manager.c
+++ b/src/charon/control/interface_manager.c
@@ -239,6 +239,14 @@ static bool unroute_listener(interface_bus_listener_t *this, signal_t signal,
}
/**
+ * remove a previously registered listener from the bus
+ */
+static void remove_listener(interface_bus_listener_t *listener)
+{
+ charon->bus->remove_listener(charon->bus, &listener->listener);
+}
+
+/**
* Implementation of interface_manager_t.initiate.
*/
static status_t initiate(private_interface_manager_t *this,
@@ -259,6 +267,7 @@ static status_t initiate(private_interface_manager_t *this,
{
ike_sa->set_peer_cfg(ike_sa, peer_cfg);
}
+ peer_cfg->destroy(peer_cfg);
listener.listener.signal = (void*)initiate_listener;
listener.callback = callback;
@@ -297,8 +306,10 @@ static status_t initiate(private_interface_manager_t *this,
retval = NEED_MORE;
break;
}
+ pthread_cleanup_push((void*)remove_listener, &listener);
signal = charon->bus->listen(charon->bus, &level, &thread,
&current, &format, &args);
+ pthread_cleanup_pop(0);
/* ike_sa is a valid pointer until we get one of the signals */
if (ike_sa == current)
{
@@ -373,8 +384,10 @@ static status_t terminate_ike(interface_manager_t *this, u_int32_t unique_id,
status = NEED_MORE;
break;
}
+ pthread_cleanup_push((void*)remove_listener, &listener);
signal = charon->bus->listen(charon->bus, &level, &thread,
&current, &format, &args);
+ pthread_cleanup_pop(0);
/* even if we checked in the IKE_SA, the pointer is valid until
* we get an IKE_DOWN_... */
@@ -475,8 +488,10 @@ static status_t terminate_child(interface_manager_t *this, u_int32_t reqid,
status = NEED_MORE;
break;
}
+ pthread_cleanup_push((void*)remove_listener, &listener);
signal = charon->bus->listen(charon->bus, &level, &thread,
&current, &format, &args);
+ pthread_cleanup_pop(0);
/* even if we checked in the IKE_SA, the pointer is valid until
* we get an IKE_DOWN_... */
if (ike_sa == current)
diff --git a/src/charon/control/interface_manager.h b/src/charon/control/interface_manager.h
index 3c1613a91..06a5fe6c4 100644
--- a/src/charon/control/interface_manager.h
+++ b/src/charon/control/interface_manager.h
@@ -84,6 +84,10 @@ struct interface_manager_t {
/**
* @brief Initiate a CHILD_SA, and if required, an IKE_SA.
*
+ * The inititate() function is synchronous and thus blocks until the
+ * IKE_SA is established or failed. Because of this, the initiate() function
+ * contains a thread cancellation point.
+ *
* @param this calling object
* @param peer_cfg peer_cfg to use for IKE_SA setup
* @param child_cfg child_cfg to set up CHILD_SA from
@@ -101,6 +105,10 @@ struct interface_manager_t {
/**
* @brief Terminate an IKE_SA and all of its CHILD_SAs.
*
+ * The terminate() function is synchronous and thus blocks until the
+ * IKE_SA is properly deleted, or the delete timed out.
+ * The terminate() function contains a thread cancellation point.
+ *
* @param this calling object
* @param unique_id unique id of the IKE_SA to terminate.
* @param cb logging callback
diff --git a/src/charon/control/interfaces/dbus_interface.c b/src/charon/control/interfaces/dbus_interface.c
index 5159f1d90..443df635c 100644
--- a/src/charon/control/interfaces/dbus_interface.c
+++ b/src/charon/control/interfaces/dbus_interface.c
@@ -206,9 +206,11 @@ static bool start_connection(private_dbus_interface_t *this, DBusMessage* msg)
{
status = charon->interfaces->initiate(charon->interfaces, peer_cfg,
child_cfg, dbus_log, NULL);
- peer_cfg->destroy(peer_cfg);
}
- child_cfg->destroy(child_cfg);
+ else
+ {
+ peer_cfg->destroy(peer_cfg);
+ }
}
reply = dbus_message_new_method_return(msg);
dbus_connection_send(this->conn, reply, NULL);
diff --git a/src/charon/control/interfaces/stroke_interface.c b/src/charon/control/interfaces/stroke_interface.c
index 544ff61c5..6e3427e8e 100755
--- a/src/charon/control/interfaces/stroke_interface.c
+++ b/src/charon/control/interfaces/stroke_interface.c
@@ -784,8 +784,6 @@ static void stroke_initiate(private_stroke_interface_t *this,
charon->interfaces->initiate(charon->interfaces, peer_cfg, child_cfg,
(interface_manager_cb_t)stroke_log, &info);
- peer_cfg->destroy(peer_cfg);
- child_cfg->destroy(child_cfg);
}
/**