From: Martin Willi Date: Tue, 20 Dec 2011 18:03:12 +0000 (+0100) Subject: Don't requeue IKEv1 init tasks if they already exist in a second keyingtry X-Git-Tag: 5.0.0~338^2~9^2~129 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8ed976c061a7093d2d29d0c31a541aee8e9ec448;p=thirdparty%2Fstrongswan.git Don't requeue IKEv1 init tasks if they already exist in a second keyingtry --- diff --git a/src/libcharon/sa/ikev1/task_manager_v1.c b/src/libcharon/sa/ikev1/task_manager_v1.c index 37c3f76fb7..f31f497836 100644 --- a/src/libcharon/sa/ikev1/task_manager_v1.c +++ b/src/libcharon/sa/ikev1/task_manager_v1.c @@ -1013,14 +1013,51 @@ METHOD(task_manager_t, queue_task, void, this->queued_tasks->insert_last(this->queued_tasks, task); } +/** + * Check if a given task has been queued already + */ +static bool has_queued(private_task_manager_t *this, task_type_t type) +{ + enumerator_t *enumerator; + bool found = FALSE; + task_t *task; + + enumerator = this->queued_tasks->create_enumerator(this->queued_tasks); + while (enumerator->enumerate(enumerator, &task)) + { + if (task->get_type(task) == type) + { + found = TRUE; + break; + } + } + enumerator->destroy(enumerator); + return found; +} + METHOD(task_manager_t, queue_ike, void, private_task_manager_t *this) { - queue_task(this, (task_t*)isakmp_vendor_create(this->ike_sa, TRUE)); - queue_task(this, (task_t*)isakmp_cert_pre_create(this->ike_sa, TRUE)); - queue_task(this, (task_t*)main_mode_create(this->ike_sa, TRUE)); - queue_task(this, (task_t*)isakmp_cert_post_create(this->ike_sa, TRUE)); - queue_task(this, (task_t*)isakmp_natd_create(this->ike_sa, TRUE)); + if (!has_queued(this, TASK_ISAKMP_VENDOR)) + { + queue_task(this, (task_t*)isakmp_vendor_create(this->ike_sa, TRUE)); + } + if (!has_queued(this, TASK_ISAKMP_CERT_PRE)) + { + queue_task(this, (task_t*)isakmp_cert_pre_create(this->ike_sa, TRUE)); + } + if (!has_queued(this, TASK_MAIN_MODE)) + { + queue_task(this, (task_t*)main_mode_create(this->ike_sa, TRUE)); + } + if (!has_queued(this, TASK_ISAKMP_CERT_POST)) + { + queue_task(this, (task_t*)isakmp_cert_post_create(this->ike_sa, TRUE)); + } + if (!has_queued(this, TASK_ISAKMP_NATD)) + { + queue_task(this, (task_t*)isakmp_natd_create(this->ike_sa, TRUE)); + } } METHOD(task_manager_t, queue_ike_rekey, void,