From: Tobias Brunner Date: Fri, 29 Mar 2019 15:50:26 +0000 (+0100) Subject: controller: Make child config optional for initiate() X-Git-Tag: 5.8.0rc1~24^2~7 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6b00d34b4233c1848b4d0f428bf1e81c9f23f5f0;p=thirdparty%2Fstrongswan.git controller: Make child config optional for initiate() --- 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