id-payload: Enable multiple calls to get_ts() for subnet traffic selectors
authorTobias Brunner <tobias@strongswan.org>
Thu, 16 Oct 2014 14:10:41 +0000 (16:10 +0200)
committerTobias Brunner <tobias@strongswan.org>
Fri, 5 Dec 2014 08:32:38 +0000 (09:32 +0100)
The second call resulted in a /32 subnet previously.

src/libcharon/encoding/payloads/id_payload.c

index a002a8f..bb8aab7 100644 (file)
@@ -258,17 +258,20 @@ static traffic_selector_t *get_ts_from_range(private_id_payload_t *this,
 static traffic_selector_t *get_ts_from_subnet(private_id_payload_t *this,
                                                                                          ts_type_t type)
 {
+       traffic_selector_t *ts;
        chunk_t net, netmask;
        int i;
 
        net = chunk_create(this->id_data.ptr, this->id_data.len / 2);
-       netmask = chunk_skip(this->id_data, this->id_data.len / 2);
+       netmask = chunk_clone(chunk_skip(this->id_data, this->id_data.len / 2));
        for (i = 0; i < net.len; i++)
        {
                netmask.ptr[i] = (netmask.ptr[i] ^ 0xFF) | net.ptr[i];
        }
-       return traffic_selector_create_from_bytes(this->protocol_id, type,
+       ts = traffic_selector_create_from_bytes(this->protocol_id, type,
                                                                net, this->port, netmask, this->port ?: 65535);
+       chunk_free(&netmask);
+       return ts;
 }
 
 /**