Skip site navigation (1)Skip section navigation (2)
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>