From 6b00d34b4233c1848b4d0f428bf1e81c9f23f5f0 Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Fri, 29 Mar 2019 16:50:26 +0100 Subject: [PATCH] controller: Make child config optional for initiate() --- src/libcharon/control/controller.c | 23 ++++++++++++++--------- src/libcharon/control/controller.h | 2 +- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/libcharon/control/controller.c b/src/libcharon/control/controller.c index 589c536d25..0c86275e20 100644 --- a/src/libcharon/control/controller.c +++ b/src/libcharon/control/controller.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011-2015 Tobias Brunner + * Copyright (C) 2011-2019 Tobias Brunner * Copyright (C) 2007-2011 Martin Willi * Copyright (C) 2011 revosec AG * HSR Hochschule fuer Technik Rapperswil @@ -265,19 +265,24 @@ METHOD(listener_t, ike_state_change, bool, { switch (state) { -#ifdef ME case IKE_ESTABLISHED: - { /* mediation connections are complete without CHILD_SA */ + { +#ifdef ME peer_cfg_t *peer_cfg = ike_sa->get_peer_cfg(ike_sa); - - if (peer_cfg->is_mediation(peer_cfg)) +#endif /* ME */ + /* we're done if we didn't initiate a CHILD_SA */ + if (!this->child_cfg +#ifdef ME + /* the same is always true for mediation connections */ + || peer_cfg->is_mediation(peer_cfg) +#endif /* ME */ + ) { this->status = SUCCESS; return listener_done(this); } break; } -#endif /* ME */ case IKE_DESTROYING: return listener_done(this); default: @@ -414,7 +419,7 @@ METHOD(job_t, initiate_execute, job_requeue_t, peer_cfg); if (!ike_sa) { - listener->child_cfg->destroy(listener->child_cfg); + DESTROY_IF(listener->child_cfg); peer_cfg->destroy(peer_cfg); listener->status = FAILED; listener_done(listener); @@ -446,7 +451,7 @@ METHOD(job_t, initiate_execute, job_requeue_t, "%d exceeds limit of %d", half_open, limit_half_open); charon->ike_sa_manager->checkin_and_destroy(charon->ike_sa_manager, ike_sa); - listener->child_cfg->destroy(listener->child_cfg); + DESTROY_IF(listener->child_cfg); listener->status = INVALID_STATE; listener_done(listener); return JOB_REQUEUE_NONE; @@ -465,7 +470,7 @@ METHOD(job_t, initiate_execute, job_requeue_t, "limit of %d", jobs, limit_job_load); charon->ike_sa_manager->checkin_and_destroy( charon->ike_sa_manager, ike_sa); - listener->child_cfg->destroy(listener->child_cfg); + DESTROY_IF(listener->child_cfg); listener->status = INVALID_STATE; listener_done(listener); return JOB_REQUEUE_NONE; diff --git a/src/libcharon/control/controller.h b/src/libcharon/control/controller.h index af9baca014..b4ccfced2f 100644 --- a/src/libcharon/control/controller.h +++ b/src/libcharon/control/controller.h @@ -78,7 +78,7 @@ struct controller_t { * until the IKE_SA is established or failed. * * @param peer_cfg peer_cfg to use for IKE_SA setup - * @param child_cfg child_cfg to set up CHILD_SA from + * @param child_cfg optional child_cfg to set up CHILD_SA from * @param cb logging callback * @param param parameter to include in each call of cb * @param timeout timeout in ms to wait for callbacks, 0 to disable -- 2.47.2