aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorThomas Egerer <thomas.egerer@secunet.com>2010-06-30 13:10:56 +0200
committerMartin Willi <martin@revosec.ch>2010-06-30 13:24:43 +0200
commit31d0efd7e9b22f913395cd3fcfe47f8b199a0759 (patch)
tree5e106076303da47144e1aa3f1bf641b3281439b0 /src
parentc177076b50fe008d4fa9417668e11177a75faa40 (diff)
downloadstrongswan-31d0efd7e9b22f913395cd3fcfe47f8b199a0759.tar.bz2
strongswan-31d0efd7e9b22f913395cd3fcfe47f8b199a0759.tar.xz
Use enumerator for queued_tasks migration to avoid infinite loop
Diffstat (limited to 'src')
-rw-r--r--src/libcharon/sa/task_manager.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/src/libcharon/sa/task_manager.c b/src/libcharon/sa/task_manager.c
index 568f31a3a..a68826440 100644
--- a/src/libcharon/sa/task_manager.c
+++ b/src/libcharon/sa/task_manager.c
@@ -986,6 +986,7 @@ METHOD(task_manager_t, busy, bool,
METHOD(task_manager_t, reset, void,
private_task_manager_t *this, u_int32_t initiate, u_int32_t respond)
{
+ enumerator_t *enumerator;
task_t *task;
/* reset message counters and retransmit packets */
@@ -1004,12 +1005,13 @@ METHOD(task_manager_t, reset, void,
this->initiating.type = EXCHANGE_TYPE_UNDEFINED;
/* reset queued tasks */
- while (this->queued_tasks->remove_last(this->queued_tasks,
- (void**)&task) == SUCCESS)
+ enumerator = this->queued_tasks->create_enumerator(this->queued_tasks);
+ while (enumerator->enumerate(enumerator, &task))
{
task->migrate(task, this->ike_sa);
- this->queued_tasks->insert_first(this->queued_tasks, task);
}
+ enumerator->destroy(enumerator);
+
/* reset active tasks */
while (this->active_tasks->remove_last(this->active_tasks,
(void**)&task) == SUCCESS)