Date: Wed, 19 Oct 2011 12:40:50 -0400 From: Larry Baird <lab@gta.com> To: freebsd-net@freebsd.org Subject: Possible bug in recent L2 modifications to in.c Message-ID: <20111019164050.GA54299@gta.com>
next in thread | raw e-mail | index | archive | help
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@gta.com | TEL 407-380-0220, FAX 407-380-6080
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20111019164050.GA54299>
