Use enumerator for queued_tasks migration to avoid infinite loop

This commit is contained in:
Thomas Egerer
2010-06-30 13:24:43 +02:00
committed by Martin Willi
parent c177076b50
commit 31d0efd7e9
+5 -3
View File
@@ -986,6 +986,7 @@ METHOD(task_manager_t, busy, bool,
METHOD(task_manager_t, reset, void, METHOD(task_manager_t, reset, void,
private_task_manager_t *this, u_int32_t initiate, u_int32_t respond) private_task_manager_t *this, u_int32_t initiate, u_int32_t respond)
{ {
enumerator_t *enumerator;
task_t *task; task_t *task;
/* reset message counters and retransmit packets */ /* reset message counters and retransmit packets */
@@ -1004,12 +1005,13 @@ METHOD(task_manager_t, reset, void,
this->initiating.type = EXCHANGE_TYPE_UNDEFINED; this->initiating.type = EXCHANGE_TYPE_UNDEFINED;
/* reset queued tasks */ /* reset queued tasks */
while (this->queued_tasks->remove_last(this->queued_tasks, enumerator = this->queued_tasks->create_enumerator(this->queued_tasks);
(void**)&task) == SUCCESS) while (enumerator->enumerate(enumerator, &task))
{ {
task->migrate(task, this->ike_sa); task->migrate(task, this->ike_sa);
this->queued_tasks->insert_first(this->queued_tasks, task);
} }
enumerator->destroy(enumerator);
/* reset active tasks */ /* reset active tasks */
while (this->active_tasks->remove_last(this->active_tasks, while (this->active_tasks->remove_last(this->active_tasks,
(void**)&task) == SUCCESS) (void**)&task) == SUCCESS)