File 0015-strongswan-5.3.3-ikev1-drop-transaction-quick-mode-requests.patch of Package strongswan.22505
commit b0b0c9137d7bfd7afe54f64e49bc45d317a8e101
Author: Tobias Brunner <tobias@strongswan.org>
Date: Mon Sep 28 17:30:36 2015 +0200
ikev1: Drop TRANSACTION/QUICK_MODE requests until we received the last AM message
diff --git a/src/libcharon/sa/ikev1/task_manager_v1.c b/src/libcharon/sa/ikev1/task_manager_v1.c
index e1747d2..1a6f868 100644
--- a/src/libcharon/sa/ikev1/task_manager_v1.c
+++ b/src/libcharon/sa/ikev1/task_manager_v1.c
@@ -935,6 +935,28 @@ static bool have_quick_mode_task(private_task_manager_t *this, u_int32_t mid)
}
/**
+ * Check if we still have an aggressive mode task queued
+ */
+static bool have_aggressive_mode_task(private_task_manager_t *this)
+{
+ enumerator_t *enumerator;
+ task_t *task;
+ bool found = FALSE;
+
+ enumerator = this->passive_tasks->create_enumerator(this->passive_tasks);
+ while (enumerator->enumerate(enumerator, &task))
+ {
+ if (task->get_type(task) == TASK_AGGRESSIVE_MODE)
+ {
+ found = TRUE;
+ break;
+ }
+ }
+ enumerator->destroy(enumerator);
+ return found;
+}
+
+/**
* handle an incoming request message
*/
static status_t process_request(private_task_manager_t *this,
@@ -1340,6 +1362,16 @@ METHOD(task_manager_t, process_message, status_t,
}
}
+ /* drop XAuth/Mode Config/Quick Mode messages until we received the last
+ * Aggressive Mode message */
+ if (have_aggressive_mode_task(this) &&
+ msg->get_exchange_type(msg) != AGGRESSIVE)
+ {
+ DBG1(DBG_IKE, "ignoring %N request while phase 1 is incomplete",
+ exchange_type_names, msg->get_exchange_type(msg));
+ return FAILED;
+ }
+
if (msg->get_exchange_type(msg) == TRANSACTION &&
this->active_tasks->get_count(this->active_tasks))
{ /* main mode not yet complete, queue XAuth/Mode config tasks */