mirror of
https://github.com/freebsd/freebsd-src.git
synced 2024-11-27 04:53:28 +00:00
route: error on IPv4 network routes with incorrect destination
Route destinations like 10/8 are most likely intended as a shorthand
for 10.0.0.0/8, but instead it means 0.0.0.10/8, which includes
only bits in the host part of the mask, and hence adds a route to
0.0.0.0/8. In 12.x, there was code to "do what I mean", which was
removed as part of a cleanup of old network class remnants. Given
that we have gone this long without that code, do not restore that
behavior. Instead, detect the issue and produce an error.
Specifically, if there are no dots in a numeric IPv4 address, the
mask is specified with CIDR notation (using a slash), and there are
bits set in the host part, produce an error like this for 10/8:
route: malformed address, bits set after mask; 10 means 0.0.0.10
PR: 258874
Reviewed by: melifaro, emaste
Differential Revision: https://reviews.freebsd.org/D43384
(cherry picked from commit b9e8ae1d8a
)
This commit is contained in:
parent
1614823a49
commit
74e52718aa
@ -1309,6 +1309,9 @@ getaddr(int idx, char *str, int nrflags)
|
||||
q = strchr(str,'/');
|
||||
if (q != NULL && idx == RTAX_DST) {
|
||||
/* A.B.C.D/NUM */
|
||||
struct sockaddr_in *mask;
|
||||
uint32_t mask_bits;
|
||||
|
||||
*q = '\0';
|
||||
if (inet_aton(str, &sin->sin_addr) == 0)
|
||||
errx(EX_NOHOST, "bad address: %s", str);
|
||||
@ -1318,6 +1321,20 @@ getaddr(int idx, char *str, int nrflags)
|
||||
errx(EX_NOHOST, "bad mask length: %s", q + 1);
|
||||
|
||||
inet_makemask((struct sockaddr_in *)&so[RTAX_NETMASK],masklen);
|
||||
|
||||
/*
|
||||
* Check for bogus destination such as "10/8"; heuristic is
|
||||
* that there are bits set in the host part, and no dot
|
||||
* is present.
|
||||
*/
|
||||
mask = ((struct sockaddr_in *) &so[RTAX_NETMASK]);
|
||||
mask_bits = ntohl(mask->sin_addr.s_addr);
|
||||
if ((ntohl(sin->sin_addr.s_addr) & ~mask_bits) != 0 &&
|
||||
strchr(str, '.') == NULL)
|
||||
errx(EX_NOHOST,
|
||||
"malformed address, bits set after mask;"
|
||||
" %s means %s",
|
||||
str, inet_ntoa(sin->sin_addr));
|
||||
return (0);
|
||||
}
|
||||
if (inet_aton(str, &sin->sin_addr) != 0)
|
||||
|
Loading…
Reference in New Issue
Block a user