diff options
author | Andreas Steffen <andreas.steffen@strongswan.org> | 2011-06-03 00:19:22 +0200 |
---|---|---|
committer | Andreas Steffen <andreas.steffen@strongswan.org> | 2011-06-03 00:24:16 +0200 |
commit | abc2443a3816ac35bdce92e6397c980f6be9ca9f (patch) | |
tree | 0537f8d08db48743d0b875a11bc8f125b223211d /src | |
parent | 51679e67c9d926b12779f8fea6e07a4ff335c497 (diff) | |
download | strongswan-abc2443a3816ac35bdce92e6397c980f6be9ca9f.tar.bz2 strongswan-abc2443a3816ac35bdce92e6397c980f6be9ca9f.tar.xz |
fixed IP range to subnet conversion in ts_to_subnet()
Diffstat (limited to 'src')
-rw-r--r-- | src/libstrongswan/selectors/traffic_selector.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/src/libstrongswan/selectors/traffic_selector.c b/src/libstrongswan/selectors/traffic_selector.c index 32da194ef..8af5c8419 100644 --- a/src/libstrongswan/selectors/traffic_selector.c +++ b/src/libstrongswan/selectors/traffic_selector.c @@ -24,6 +24,7 @@ #include <utils/linked_list.h> #include <utils/identification.h> +#include <debug.h> #define NON_SUBNET_ADDRESS_RANGE 255 @@ -599,7 +600,7 @@ static void to_subnet(private_traffic_selector_t *this, host_t **net, u_int8_t * * be anything else but a subnet. We use from_addr as subnet * and try to calculate a usable subnet mask. */ - int family, byte; + int family, non_zero_bytes; u_int16_t port = 0; chunk_t net_chunk; @@ -622,12 +623,12 @@ static void to_subnet(private_traffic_selector_t *this, host_t **net, u_int8_t * } net_chunk.ptr = malloc(net_chunk.len); - memcpy(net_chunk.ptr, this->from, net_chunk.len); - - for (byte = net_chunk.len - 1; byte >= (*mask / 8); --byte) + memset(net_chunk.ptr, 0x00, net_chunk.len); + if (*mask) { - int shift = (byte + 1) * 8 - *mask; - net_chunk.ptr[byte] = net_chunk.ptr[byte] & (0xFF << shift); + non_zero_bytes = (*mask + 7) / 8; + memcpy(net_chunk.ptr, this->from, non_zero_bytes); + net_chunk.ptr[non_zero_bytes-1] &= 0xFF << (8 * non_zero_bytes - *mask); } if (this->to_port == this->from_port) |