X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=utils.c;h=aca98d59657d037b8789769a0e18244c757c7405;hb=097282eace13feb4a115b55d497588bf2b550f62;hp=cb478bb81c7a95eb97f9650bbb6f541ec32194e0;hpb=8205107ffd31a21c1d4d93eaa7a44d41c6c3c10d;p=project%2Ffirewall3.git diff --git a/utils.c b/utils.c index cb478bb..aca98d5 100644 --- a/utils.c +++ b/utils.c @@ -1,7 +1,7 @@ /* * firewall3 - 3rd OpenWrt UCI firewall implementation * - * Copyright (C) 2013 Jo-Philipp Wich + * Copyright (C) 2013 Jo-Philipp Wich * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -774,6 +774,7 @@ bool fw3_bitlen2netmask(int family, int bits, void *mask) { int i; + uint8_t rem, b; struct in_addr *v4; struct in6_addr *v6; @@ -783,14 +784,17 @@ fw3_bitlen2netmask(int family, int bits, void *mask) return false; v6 = mask; - i = abs(bits); + rem = abs(bits); - memset(v6->s6_addr, 0xff, i / 8); - memset(v6->s6_addr + (i / 8) + 1, 0, (128 - i) / 8); - v6->s6_addr[i / 8] = 0xff << (8 - (i & 7)); + for (i = 0; i < sizeof(v6->s6_addr); i++) + { + b = (rem > 8) ? 8 : rem; + v6->s6_addr[i] = (uint8_t)(0xFF << (8 - b)); + rem -= b; + } if (bits < 0) - for (i = 0; i < 16; i++) + for (i = 0; i < sizeof(v6->s6_addr); i++) v6->s6_addr[i] = ~v6->s6_addr[i]; } else @@ -799,7 +803,7 @@ fw3_bitlen2netmask(int family, int bits, void *mask) return false; v4 = mask; - v4->s_addr = htonl(~((1 << (32 - abs(bits))) - 1)); + v4->s_addr = bits ? htonl(~((1 << (32 - abs(bits))) - 1)) : 0; if (bits < 0) v4->s_addr = ~v4->s_addr;