Rectify undefined behavior of out-of-range shift op

Fixes #1717, closes #1718
This commit is contained in:
nnposter 2019-09-03 21:56:31 +00:00
parent 8d59507aad
commit 9e8852a7c7
3 changed files with 31 additions and 7 deletions

View file

@ -1,5 +1,8 @@
#Nmap Changelog ($Id$); -*-text-*-
o [GH#1717][GH#1718] Processing of IP address CIDR blocks was not working
correctly on ppc64, ppc64le, and s390x architectures. [rfrohl, nnposter]
o [Windows] Add support for the new loopback behavior in Npcap 0.9983. This
enables Nmap to scan localhost on Windows without needing the Npcap Loopback
Adapter to be installed, which was a source of problems for some users.

View file

@ -477,30 +477,32 @@ static int sockaddr_to_addr(const struct sockaddr *sa, u32 *addr)
static int sockaddr_to_mask (const struct sockaddr *sa, int bits, u32 *mask)
{
s8 i;
int unmasked_bits = 0;
int i, k;
if (bits >= 0) {
if (sa->sa_family == AF_INET) {
unmasked_bits = 32 - bits;
bits += 96;
}
#ifdef HAVE_IPV6
else if (sa->sa_family == AF_INET6) {
unmasked_bits = 128 - bits;
; /* do nothing */
}
#endif
else {
return 0;
}
}
else
bits = 128;
k = bits / 32;
for (i=0; i < 4; i++) {
if (unmasked_bits <= 32 * (3 - i)) {
if (i < k) {
mask[i] = 0xffffffff;
}
else if (unmasked_bits >= 32 * (4 - i)) {
else if (i > k) {
mask[i] = 0;
}
else {
mask[i] = ~((1 << (unmasked_bits - (32 * (4 - i)))) - 1);
mask[i] = 0xfffffffe << (31 - bits % 32);
}
}
return 1;

View file

@ -208,6 +208,25 @@ test_addrset "1:2::0003/120" "1:2::3 1:2::0 1:2::ff" <<EOF
1:3::3
EOF
# IPv6 CIDR netmask.
test_addrset "1:2::3:4:5/95" "1:2::3:4:5 1:2::2:0:0 1:2::3:ffff:ffff" <<EOF
1:2::3:4:5
1:2::1:ffff:ffff
1:2::2:0:0
1:2::3:ffff:ffff
1:2::4:0:0
1:3::3
EOF
# IPv6 CIDR netmask.
test_addrset "11::2/15" "11::2:3:4:5 10::1 11:ffff:ffff:ffff:ffff:ffff:ffff:ffff" <<EOF
11::2:3:4:5
9:ffff:ffff:ffff:ffff:ffff:ffff:ffff
10::1
11:ffff:ffff:ffff:ffff:ffff:ffff:ffff
12::0
EOF
# /128 netmask.
test_addrset "1:2::0003/128" "1:2::3" <<EOF
1:2::3