1
0
mirror of https://github.com/nmap/nmap.git synced 2026-02-05 04:56:34 +00:00

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

@@ -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;