aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2014-10-16 16:10:41 +0200
committerTobias Brunner <tobias@strongswan.org>2014-12-05 09:32:38 +0100
commitbf5d0693efe8aca8c1b87457ed2da322d72a23fa (patch)
treee46cd8cd81ff7ddd7b6f82f3aab6e8d09da5594b /src
parent7459f3a5ac80b48f25a43570d695c586684e849e (diff)
downloadstrongswan-bf5d0693efe8aca8c1b87457ed2da322d72a23fa.tar.bz2
strongswan-bf5d0693efe8aca8c1b87457ed2da322d72a23fa.tar.xz
id-payload: Enable multiple calls to get_ts() for subnet traffic selectors
The second call resulted in a /32 subnet previously.
Diffstat (limited to 'src')
-rw-r--r--src/libcharon/encoding/payloads/id_payload.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/libcharon/encoding/payloads/id_payload.c b/src/libcharon/encoding/payloads/id_payload.c
index a002a8f21..bb8aab748 100644
--- a/src/libcharon/encoding/payloads/id_payload.c
+++ b/src/libcharon/encoding/payloads/id_payload.c
@@ -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;
}
/**