From: Tobias Brunner Date: Thu, 22 Aug 2019 12:23:44 +0000 (+0200) Subject: ikev2: Allow tasks to do work after processing requests/responses X-Git-Tag: 5.9.7dr2~1^2~21 X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=36312808d189d90c8607294fed57219a8be6e466;p=thirdparty%2Fstrongswan.git ikev2: Allow tasks to do work after processing requests/responses --- diff --git a/src/libcharon/sa/ikev2/task_manager_v2.c b/src/libcharon/sa/ikev2/task_manager_v2.c index 31964d7ea1..2fd7a48bb9 100644 --- a/src/libcharon/sa/ikev2/task_manager_v2.c +++ b/src/libcharon/sa/ikev2/task_manager_v2.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2018 Tobias Brunner + * Copyright (C) 2007-2019 Tobias Brunner * Copyright (C) 2007-2010 Martin Willi * * Copyright (C) secunet Security Networks AG @@ -837,6 +837,31 @@ static status_t process_response(private_task_manager_t *this, } enumerator->destroy(enumerator); + enumerator = array_create_enumerator(this->active_tasks); + while (enumerator->enumerate(enumerator, &task)) + { + if (!task->post_process) + { + continue; + } + switch (task->post_process(task, message)) + { + case SUCCESS: + array_remove_at(this->active_tasks, enumerator); + task->destroy(task); + break; + case NEED_MORE: + break; + default: + /* critical failure, destroy IKE_SA */ + array_remove_at(this->active_tasks, enumerator); + enumerator->destroy(enumerator); + task->destroy(task); + return DESTROY_ME; + } + } + enumerator->destroy(enumerator); + this->initiating.mid++; this->initiating.type = EXCHANGE_TYPE_UNDEFINED; clear_packets(this->initiating.packets); @@ -1314,6 +1339,31 @@ static status_t process_request(private_task_manager_t *this, } enumerator->destroy(enumerator); + enumerator = array_create_enumerator(this->passive_tasks); + while (enumerator->enumerate(enumerator, &task)) + { + if (!task->post_process) + { + continue; + } + switch (task->post_process(task, message)) + { + case SUCCESS: + array_remove_at(this->passive_tasks, enumerator); + task->destroy(task); + break; + case NEED_MORE: + break; + default: + /* critical failure, destroy IKE_SA */ + array_remove_at(this->passive_tasks, enumerator); + enumerator->destroy(enumerator); + task->destroy(task); + return DESTROY_ME; + } + } + enumerator->destroy(enumerator); + return build_response(this, message); }