Module Name:    src
Committed By:   roy
Date:           Sat Feb 13 13:00:16 UTC 2021

Modified Files:
        src/sys/net: if_ethersubr.c if_gre.c
        src/sys/netinet: if_arp.c

Log Message:
Prior alignment fixes should not use an offset


To generate a diff of this commit:
cvs rdiff -u -r1.290 -r1.291 src/sys/net/if_ethersubr.c
cvs rdiff -u -r1.178 -r1.179 src/sys/net/if_gre.c
cvs rdiff -u -r1.299 -r1.300 src/sys/netinet/if_arp.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/net/if_ethersubr.c
diff -u src/sys/net/if_ethersubr.c:1.290 src/sys/net/if_ethersubr.c:1.291
--- src/sys/net/if_ethersubr.c:1.290	Sat Feb 13 07:28:04 2021
+++ src/sys/net/if_ethersubr.c	Sat Feb 13 13:00:16 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ethersubr.c,v 1.290 2021/02/13 07:28:04 roy Exp $	*/
+/*	$NetBSD: if_ethersubr.c,v 1.291 2021/02/13 13:00:16 roy Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.290 2021/02/13 07:28:04 roy Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.291 2021/02/13 13:00:16 roy Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -649,23 +649,19 @@ ether_input(struct ifnet *ifp, struct mb
 	if ((ifp->if_flags & IFF_UP) == 0)
 		goto drop;
 
-	/* If the Ethernet header is not aligned, slurp it up into a new
-	 * mbuf with space for link headers, in the event we forward
-	 * it.  Otherwise, if it is aligned, make sure the entire
-	 * base Ethernet header is in the first mbuf of the chain.
-	 */
+#ifdef MBUFTRACE
+	m_claimm(m, &ec->ec_rx_mowner);
+#endif
+
+	/* Enforce alignement */
 	if (ETHER_HDR_ALIGNED_P(mtod(m, void *)) == 0) {
-		if ((m = m_copyup(m, sizeof(*eh),
-		    (max_linkhdr + 3) & ~3)) == NULL)
+		if ((m = m_copyup(m, sizeof(*eh), 0)) == NULL)
 			goto dropped;
 	} else if (__predict_false(m->m_len < sizeof(*eh))) {
 		if ((m = m_pullup(m, sizeof(*eh))) == NULL)
 			goto dropped;
 	}
 
-#ifdef MBUFTRACE
-	m_claimm(m, &ec->ec_rx_mowner);
-#endif
 	eh = mtod(m, struct ether_header *);
 	etype = ntohs(eh->ether_type);
 	ehlen = sizeof(*eh);

Index: src/sys/net/if_gre.c
diff -u src/sys/net/if_gre.c:1.178 src/sys/net/if_gre.c:1.179
--- src/sys/net/if_gre.c:1.178	Fri Feb 12 19:57:49 2021
+++ src/sys/net/if_gre.c	Sat Feb 13 13:00:16 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_gre.c,v 1.178 2021/02/12 19:57:49 roy Exp $ */
+/*	$NetBSD: if_gre.c,v 1.179 2021/02/13 13:00:16 roy Exp $ */
 
 /*
  * Copyright (c) 1998, 2008 The NetBSD Foundation, Inc.
@@ -45,7 +45,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_gre.c,v 1.178 2021/02/12 19:57:49 roy Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_gre.c,v 1.179 2021/02/13 13:00:16 roy Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_atalk.h"
@@ -396,14 +396,9 @@ gre_receive(struct socket *so, void *arg
 		return;
 	}
 
-	/* If the GRE header is not aligned, slurp it up into a new
-	 * mbuf with space for link headers, in the event we forward
-	 * it.  Otherwise, if it is aligned, make sure the entire
-	 * base GRE header is in the first mbuf of the chain.
-	 */
+	/* Enforce alignment */
 	if (GRE_HDR_ALIGNED_P(mtod(m, void *)) == 0) {
-		if ((m = m_copyup(m, sizeof(struct gre_h),
-		    (max_linkhdr + 3) & ~3)) == NULL) {
+		if ((m = m_copyup(m, sizeof(struct gre_h), 0)) == NULL) {
 			/* XXXJRT new stat, please */
 			GRE_DPRINTF(sc, "m_copyup failed\n");
 			sc->sc_pullup_ev.ev_count++;

Index: src/sys/netinet/if_arp.c
diff -u src/sys/netinet/if_arp.c:1.299 src/sys/netinet/if_arp.c:1.300
--- src/sys/netinet/if_arp.c:1.299	Sat Feb 13 07:57:09 2021
+++ src/sys/netinet/if_arp.c	Sat Feb 13 13:00:16 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_arp.c,v 1.299 2021/02/13 07:57:09 roy Exp $	*/
+/*	$NetBSD: if_arp.c,v 1.300 2021/02/13 13:00:16 roy Exp $	*/
 
 /*
  * Copyright (c) 1998, 2000, 2008 The NetBSD Foundation, Inc.
@@ -68,7 +68,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_arp.c,v 1.299 2021/02/13 07:57:09 roy Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_arp.c,v 1.300 2021/02/13 13:00:16 roy Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ddb.h"
@@ -700,14 +700,9 @@ arpintr(void)
 		MCLAIM(m, &arpdomain.dom_mowner);
 		ARP_STATINC(ARP_STAT_RCVTOTAL);
 
-		/* If the ARP header is not aligned, slurp it up into a new
-		 * mbuf with space for link headers, in the event we forward
-		 * it.  Otherwise, if it is aligned, make sure the entire
-		 * base ARP header is in the first mbuf of the chain.
-		 */
+		/* Enforce alignment */
 		if (ARP_HDR_ALIGNED_P(mtod(m, void *)) == 0) {
-			if ((m = m_copyup(m, sizeof(*ar),
-			    (max_linkhdr + 3) & ~3)) == NULL)
+			if ((m = m_copyup(m, sizeof(*ar), 0)) == NULL)
 				goto badlen;
 		} else if (__predict_false(m->m_len < sizeof(*ar))) {
 			if ((m = m_pullup(m, sizeof(*ar))) == NULL)
@@ -732,9 +727,6 @@ arpintr(void)
 				ARP_STATINC(ARP_STAT_RCVBADPROTO);
 				goto free;
 			}
-
-			arplen = sizeof(struct arphdr) +
-			    ar->ar_hln + 2 * ar->ar_pln;
 			break;
 		default:
 			if (ntohs(ar->ar_hrd) == ARPHRD_IEEE1394) {
@@ -742,17 +734,18 @@ arpintr(void)
 				ARP_STATINC(ARP_STAT_RCVBADPROTO);
 				goto free;
 			}
-
-			arplen = sizeof(struct arphdr) +
-			    2 * ar->ar_hln + 2 * ar->ar_pln;
 			break;
 		}
 
 		m_put_rcvif(rcvif, &s);
 
-		if (m->m_len < arplen && (m = m_pullup(m, arplen)) == NULL)
-			goto badlen;
-		ar = mtod(m, struct arphdr *);
+		arplen = sizeof(*ar) + 2 * ar->ar_hln + 2 * ar->ar_pln;
+		if (m->m_len < arplen) {
+			if ((m = m_pullup(m, arplen)) == NULL)
+				goto badlen;
+			ar = mtod(m, struct arphdr *);
+			KASSERT(ARP_HDR_ALIGNED_P(ar));
+		}
 
 		switch (ntohs(ar->ar_pro)) {
 		case ETHERTYPE_IP:

Reply via email to