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