Possible bug in recent L2 modifications to in.c
Larry Baird
lab at gta.com
Wed Oct 19 16:40:52 UTC 2011
The code associated with revision 225947 for modifing in.c seems suspect.
Code from revision has:
const char *sa, *mask, *addr, *lim;
int len;
sa = (const char *)rt_key(rt);
mask = (const char *)rt_mask(rt);
addr = (const char *)l3addr;
len = ((const struct sockaddr_in *)l3addr)->sin_len;
lim = addr + len;
for ( ; addr < lim; sa++, mask++, addr++) {
if ((*sa ^ *addr) & *mask) {
#ifdef DIAGNOSTIC
log(LOG_INFO, "IPv4 address: \"%s\" is not on th
e network\n",
inet_ntoa(((const struct sockaddr_in *)l3add
r)->sin_addr));
#endif
RTFREE_LOCKED(rt);
return (EINVAL);
}
}
It compares all bytes of sockaddr_in structure against mask instead of just
address. Would following code be more correct?
const char *sa, *mask, *addr, *lim;
int len;
sa = (const char *)rt_key(rt);
mask = (const char *)rt_mask(rt);
addr = (const char *)&(((const struct sockaddr_in *)l3addr)->sin_addr);
len = ((const struct sockaddr_in *)l3addr)->sin_len;
lim = (const char *)l3addr + len;
for ( ; addr < lim; sa++, mask++, addr++) {
if ((*sa ^ *addr) & *mask) {
#ifdef DIAGNOSTIC
log(LOG_INFO, "IPv4 address: \"%s\" is not on th
e network\n",
inet_ntoa(((const struct sockaddr_in *)l3add
r)->sin_addr));
#endif
RTFREE_LOCKED(rt);
return (EINVAL);
}
}
--
------------------------------------------------------------------------
Larry Baird | http://www.gta.com
Global Technology Associates, Inc. | Orlando, FL
Email: lab at gta.com | TEL 407-380-0220, FAX 407-380-6080
More information about the freebsd-net
mailing list