Fix check-in of IKE_SA when IKE_SA_INIT fails and hash table is enabled
Setting the responder SPI to 0 can only be done while generating the response, otherwise we'd fail to check in the IKE_SA again in case the hash table is enabled. That's because we use the responder SPI as hash value since 5.0.0.
This commit is contained in:
@@ -630,6 +630,8 @@ static status_t build_response(private_task_manager_t *this, message_t *request)
|
|||||||
message_t *message;
|
message_t *message;
|
||||||
host_t *me, *other;
|
host_t *me, *other;
|
||||||
bool delete = FALSE, hook = FALSE;
|
bool delete = FALSE, hook = FALSE;
|
||||||
|
ike_sa_id_t *id = NULL;
|
||||||
|
u_int64_t responder_spi;
|
||||||
status_t status;
|
status_t status;
|
||||||
|
|
||||||
me = request->get_destination(request);
|
me = request->get_destination(request);
|
||||||
@@ -680,10 +682,15 @@ static status_t build_response(private_task_manager_t *this, message_t *request)
|
|||||||
}
|
}
|
||||||
enumerator->destroy(enumerator);
|
enumerator->destroy(enumerator);
|
||||||
|
|
||||||
/* remove resonder SPI if IKE_SA_INIT failed */
|
/* RFC 5996, section 2.6 mentions that in the event of a failure during
|
||||||
|
* IKE_SA_INIT the responder's SPI will be 0 in the response, while it
|
||||||
|
* actually explicitly allows it to be non-zero. Since we use the responder
|
||||||
|
* SPI to create hashes in the IKE_SA manager we can only set the SPI to
|
||||||
|
* zero temporarily, otherwise checking the SA in would fail. */
|
||||||
if (delete && request->get_exchange_type(request) == IKE_SA_INIT)
|
if (delete && request->get_exchange_type(request) == IKE_SA_INIT)
|
||||||
{
|
{
|
||||||
ike_sa_id_t *id = this->ike_sa->get_id(this->ike_sa);
|
id = this->ike_sa->get_id(this->ike_sa);
|
||||||
|
responder_spi = id->get_responder_spi(id);
|
||||||
id->set_responder_spi(id, 0);
|
id->set_responder_spi(id, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -693,6 +700,10 @@ static status_t build_response(private_task_manager_t *this, message_t *request)
|
|||||||
status = this->ike_sa->generate_message(this->ike_sa, message,
|
status = this->ike_sa->generate_message(this->ike_sa, message,
|
||||||
&this->responding.packet);
|
&this->responding.packet);
|
||||||
message->destroy(message);
|
message->destroy(message);
|
||||||
|
if (id)
|
||||||
|
{
|
||||||
|
id->set_responder_spi(id, responder_spi);
|
||||||
|
}
|
||||||
if (status != SUCCESS)
|
if (status != SUCCESS)
|
||||||
{
|
{
|
||||||
charon->bus->ike_updown(charon->bus, this->ike_sa, FALSE);
|
charon->bus->ike_updown(charon->bus, this->ike_sa, FALSE);
|
||||||
|
|||||||
Reference in New Issue
Block a user