From: Tobias Brunner Date: Mon, 2 Oct 2023 14:17:33 +0000 (+0200) Subject: trap-manager: Maintain allocated reqids when handling acquires X-Git-Tag: 5.9.12rc1~10^2~1 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=04bfe83f71ea31d9d9d630120678821301272a87;p=thirdparty%2Fstrongswan.git trap-manager: Maintain allocated reqids when handling acquires --- diff --git a/src/libcharon/sa/trap_manager.c b/src/libcharon/sa/trap_manager.c index d8d8a421ac..1b85c66a5b 100644 --- a/src/libcharon/sa/trap_manager.c +++ b/src/libcharon/sa/trap_manager.c @@ -524,6 +524,7 @@ METHOD(trap_manager_t, acquire, void, child_cfg_t *child; ike_sa_t *ike_sa; host_t *host; + uint32_t allocated_reqid; bool wildcard, ignore = FALSE; this->lock->read_lock(this->lock); @@ -596,6 +597,8 @@ METHOD(trap_manager_t, acquire, void, peer = found->peer_cfg->get_ref(found->peer_cfg); child = found->child_sa->get_config(found->child_sa); child = child->get_ref(child); + /* only pass allocated reqids explicitly, take a reference */ + allocated_reqid = found->child_sa->get_reqid_ref(found->child_sa); /* don't hold the lock while checking out the IKE_SA */ this->lock->unlock(this->lock); @@ -635,7 +638,7 @@ METHOD(trap_manager_t, acquire, void, if (ike_sa) { child_init_args_t args = { - .reqid = reqid, + .reqid = allocated_reqid, .src = data->src, .dst = data->dst, .label = data->label, @@ -669,6 +672,10 @@ METHOD(trap_manager_t, acquire, void, destroy_acquire(acquire); child->destroy(child); } + if (allocated_reqid) + { + charon->kernel->release_reqid(charon->kernel, allocated_reqid); + } } /**