From owner-freebsd-net@FreeBSD.ORG Wed Oct 19 16:33:14 2011 Return-Path: Delivered-To: freebsd-net@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E21551065670 for ; Wed, 19 Oct 2011 16:33:14 +0000 (UTC) (envelope-from lab@gta.com) Received: from mailgate.gta.com (mailgate.gta.com [199.120.225.20]) by mx1.freebsd.org (Postfix) with SMTP id 1E5C68FC19 for ; Wed, 19 Oct 2011 16:33:13 +0000 (UTC) Received: (qmail 53615 invoked by uid 1000); 19 Oct 2011 16:33:10 -0000 Date: Wed, 19 Oct 2011 12:33:10 -0400 From: Larry Baird To: freebsd-net@freebsd.org Message-ID: <20111019163310.GA52555@gta.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4.2.3i Cc: qingli@freebsd.orf Subject: Possible bug in recent L2 modifications to in.c X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 19 Oct 2011 16:33:15 -0000 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