child-create: Maintain reference to reqid while CHILD_SA is established

This commit is contained in:
Tobias Brunner
2023-11-13 12:02:11 +01:00
parent ff269f7f1f
commit 4bfd93b8db
2 changed files with 18 additions and 1 deletions
@@ -1924,8 +1924,17 @@ METHOD(task_t, process_i, status_t,
METHOD(child_create_t, use_reqid, void, METHOD(child_create_t, use_reqid, void,
private_child_create_t *this, uint32_t reqid) private_child_create_t *this, uint32_t reqid)
{
uint32_t existing_reqid = this->child.reqid;
if (!reqid || charon->kernel->ref_reqid(charon->kernel, reqid) == SUCCESS)
{ {
this->child.reqid = reqid; this->child.reqid = reqid;
if (existing_reqid)
{
charon->kernel->release_reqid(charon->kernel, existing_reqid);
}
}
} }
METHOD(child_create_t, use_marks, void, METHOD(child_create_t, use_marks, void,
@@ -2064,6 +2073,10 @@ METHOD(task_t, destroy, void,
{ {
DESTROY_IF(this->child_sa); DESTROY_IF(this->child_sa);
} }
if (this->child.reqid)
{
charon->kernel->release_reqid(charon->kernel, this->child.reqid);
}
DESTROY_IF(this->packet_tsi); DESTROY_IF(this->packet_tsi);
DESTROY_IF(this->packet_tsr); DESTROY_IF(this->packet_tsr);
DESTROY_IF(this->proposal); DESTROY_IF(this->proposal);
@@ -49,6 +49,10 @@ struct child_create_t {
* When this task is used for rekeying, the same reqid is used * When this task is used for rekeying, the same reqid is used
* for the new CHILD_SA. * for the new CHILD_SA.
* *
* This must only be called with dynamically allocated reqids (i.e. from
* kernel_interface_t::alloc_reqid()), the method takes a reference that's
* maintained for the lifetime of the task.
*
* @param reqid reqid to use * @param reqid reqid to use
*/ */
void (*use_reqid) (child_create_t *this, uint32_t reqid); void (*use_reqid) (child_create_t *this, uint32_t reqid);