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>