ikev1: Avoid fourth QM message if third QM messages of multiple exchanges are handled delayed
If we haven't received the third QM message for multiple exchanges the
return value of NEED_MORE for passive tasks that are not responsible for
a specific exchange would trigger a fourth empty QM message.
Fixes: 4de361d92c ("ikev1: Fix handling of overlapping Quick Mode exchanges")
References #1076.
This commit is contained in:
@@ -752,6 +752,12 @@ static status_t build_response(private_task_manager_t *this, message_t *request)
|
|||||||
case ALREADY_DONE:
|
case ALREADY_DONE:
|
||||||
cancelled = TRUE;
|
cancelled = TRUE;
|
||||||
break;
|
break;
|
||||||
|
case INVALID_ARG:
|
||||||
|
if (task->get_type(task) == TASK_QUICK_MODE)
|
||||||
|
{ /* not responsible for this exchange */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
/* FALL */
|
||||||
case FAILED:
|
case FAILED:
|
||||||
default:
|
default:
|
||||||
charon->bus->ike_updown(charon->bus, this->ike_sa, FALSE);
|
charon->bus->ike_updown(charon->bus, this->ike_sa, FALSE);
|
||||||
@@ -1034,6 +1040,12 @@ static status_t process_request(private_task_manager_t *this,
|
|||||||
case ALREADY_DONE:
|
case ALREADY_DONE:
|
||||||
send_response = FALSE;
|
send_response = FALSE;
|
||||||
break;
|
break;
|
||||||
|
case INVALID_ARG:
|
||||||
|
if (task->get_type(task) == TASK_QUICK_MODE)
|
||||||
|
{ /* not responsible for this exchange */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
/* FALL */
|
||||||
case FAILED:
|
case FAILED:
|
||||||
default:
|
default:
|
||||||
charon->bus->ike_updown(charon->bus, this->ike_sa, FALSE);
|
charon->bus->ike_updown(charon->bus, this->ike_sa, FALSE);
|
||||||
|
|||||||
@@ -1026,7 +1026,7 @@ METHOD(task_t, process_r, status_t,
|
|||||||
{
|
{
|
||||||
if (this->mid && this->mid != message->get_message_id(message))
|
if (this->mid && this->mid != message->get_message_id(message))
|
||||||
{ /* not responsible for this quick mode exchange */
|
{ /* not responsible for this quick mode exchange */
|
||||||
return NEED_MORE;
|
return INVALID_ARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (this->state)
|
switch (this->state)
|
||||||
@@ -1200,7 +1200,7 @@ METHOD(task_t, build_r, status_t,
|
|||||||
{
|
{
|
||||||
if (this->mid && this->mid != message->get_message_id(message))
|
if (this->mid && this->mid != message->get_message_id(message))
|
||||||
{ /* not responsible for this quick mode exchange */
|
{ /* not responsible for this quick mode exchange */
|
||||||
return NEED_MORE;
|
return INVALID_ARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (this->state)
|
switch (this->state)
|
||||||
|
|||||||
Reference in New Issue
Block a user