]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
trap-manager: Maintain allocated reqids when handling acquires
authorTobias Brunner <tobias@strongswan.org>
Mon, 2 Oct 2023 14:17:33 +0000 (16:17 +0200)
committerTobias Brunner <tobias@strongswan.org>
Mon, 13 Nov 2023 11:02:11 +0000 (12:02 +0100)
src/libcharon/sa/trap_manager.c

index d8d8a421ac2b16860eaf11c9d8e7049ab7f1b939..1b85c66a5b7f0aef097b22d7c0c1bd6c6c531434 100644 (file)
@@ -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);
+       }
 }
 
 /**