aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Zec <zec@FreeBSD.org>2021-09-15 20:23:17 +0000
committerMarko Zec <zec@FreeBSD.org>2021-09-18 17:36:32 +0000
commitd3b9b83623f2b7ab89d9c09b3e93360e0b72402b (patch)
tree91174f0a23b5746d5ebbc0d2fa1077a7e660c718
parent5f4ba94eb591bea8f41555a0738725a11ee29802 (diff)
downloadsrc-d3b9b83623f2b7ab89d9c09b3e93360e0b72402b.tar.gz
src-d3b9b83623f2b7ab89d9c09b3e93360e0b72402b.zip
[fib algo][dxr] Fix undefined behavior.
The result of shifting uint32_t by 32 (or more) is undefined: fix it. (cherry picked from commit 442c8a245ee3c6640fc9321e18e8316edf469805)
-rw-r--r--sys/netinet/in_fib_dxr.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/sys/netinet/in_fib_dxr.c b/sys/netinet/in_fib_dxr.c
index ec32819a5a6d..7afe2a3da024 100644
--- a/sys/netinet/in_fib_dxr.c
+++ b/sys/netinet/in_fib_dxr.c
@@ -1150,7 +1150,10 @@ dxr_change_rib_batch(struct rib_head *rnh, struct fib_change_queue *q,
#endif
plen = q->entries[ui].plen;
ip = ntohl(q->entries[ui].addr4.s_addr);
- hmask = 0xffffffffU >> plen;
+ if (plen < 32)
+ hmask = 0xffffffffU >> plen;
+ else
+ hmask = 0;
start = (ip & ~hmask) >> DXR_RANGE_SHIFT;
end = (ip | hmask) >> DXR_RANGE_SHIFT;