]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
ikev2: Allow tasks to do work after processing requests/responses
authorTobias Brunner <tobias@strongswan.org>
Thu, 22 Aug 2019 12:23:44 +0000 (14:23 +0200)
committerAndreas Steffen <andreas.steffen@strongswan.org>
Fri, 18 Oct 2019 15:10:30 +0000 (17:10 +0200)
src/libcharon/sa/ikev2/task_manager_v2.c

index 37e7aa592495858b8c33f303b2aa58a1f1227655..bcf403b693faa057e189826ae35926d1f3a0c8f8 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007-2018 Tobias Brunner
+ * Copyright (C) 2007-2019 Tobias Brunner
  * Copyright (C) 2007-2010 Martin Willi
  * HSR Hochschule fuer Technik Rapperswil
  *
@@ -803,6 +803,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);
@@ -1280,6 +1305,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);
 }