quick-mode: Correctly prepare NAT-OA payloads as responder
authorTobias Brunner <tobias@strongswan.org>
Fri, 3 Mar 2017 16:11:04 +0000 (17:11 +0100)
committerTobias Brunner <tobias@strongswan.org>
Mon, 6 Mar 2017 14:10:35 +0000 (15:10 +0100)
The initiator's address was sent back twice previously.

Fixes #2268.

src/libcharon/sa/ikev1/tasks/quick_mode.c

index 6b89641..bbb8858 100644 (file)
@@ -703,25 +703,30 @@ static void add_nat_oa_payloads(private_quick_mode_t *this, message_t *message)
 {
        identification_t *id;
        id_payload_t *nat_oa;
 {
        identification_t *id;
        id_payload_t *nat_oa;
-       host_t *src, *dst;
+       host_t *init, *resp;
        payload_type_t nat_oa_payload_type;
 
        payload_type_t nat_oa_payload_type;
 
-       src = message->get_source(message);
-       dst = message->get_destination(message);
-
-       src = this->initiator ? src : dst;
-       dst = this->initiator ? dst : src;
+       if (this->initiator)
+       {
+               init = message->get_source(message);
+               resp = message->get_destination(message);
+       }
+       else
+       {
+               init = message->get_destination(message);
+               resp = message->get_source(message);
+       }
 
        nat_oa_payload_type = get_nat_oa_payload_type(this->ike_sa);
 
        /* first NAT-OA is the initiator's address */
 
        nat_oa_payload_type = get_nat_oa_payload_type(this->ike_sa);
 
        /* first NAT-OA is the initiator's address */
-       id = identification_create_from_sockaddr(src->get_sockaddr(src));
+       id = identification_create_from_sockaddr(init->get_sockaddr(init));
        nat_oa = id_payload_create_from_identification(nat_oa_payload_type, id);
        message->add_payload(message, (payload_t*)nat_oa);
        id->destroy(id);
 
        /* second NAT-OA is that of the responder */
        nat_oa = id_payload_create_from_identification(nat_oa_payload_type, id);
        message->add_payload(message, (payload_t*)nat_oa);
        id->destroy(id);
 
        /* second NAT-OA is that of the responder */
-       id = identification_create_from_sockaddr(dst->get_sockaddr(dst));
+       id = identification_create_from_sockaddr(resp->get_sockaddr(resp));
        nat_oa = id_payload_create_from_identification(nat_oa_payload_type, id);
        message->add_payload(message, (payload_t*)nat_oa);
        id->destroy(id);
        nat_oa = id_payload_create_from_identification(nat_oa_payload_type, id);
        message->add_payload(message, (payload_t*)nat_oa);
        id->destroy(id);