Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 31 Mar 2010 22:16:05 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r206017 - head/sys/netgraph
Message-ID:  <201003312216.o2VMG5L7038645@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Wed Mar 31 22:16:05 2010
New Revision: 206017
URL: http://svn.freebsd.org/changeset/base/206017

Log:
  Make ng_ksocket fulfill lower protocol stack layers alignment requirements
  on platforms with strict alignment constraints.
  This fixes kernel panics on arm and probably other architectures.
  
  PR:		sparc64/80410

Modified:
  head/sys/netgraph/ng_ksocket.c

Modified: head/sys/netgraph/ng_ksocket.c
==============================================================================
--- head/sys/netgraph/ng_ksocket.c	Wed Mar 31 22:11:19 2010	(r206016)
+++ head/sys/netgraph/ng_ksocket.c	Wed Mar 31 22:16:05 2010	(r206017)
@@ -902,12 +902,24 @@ ng_ksocket_rcvdata(hook_p hook, item_p i
 	struct sockaddr *sa = NULL;
 	int error;
 	struct mbuf *m;
+#ifdef ALIGNED_POINTER
+	struct mbuf *n;
+#endif /* ALIGNED_POINTER */
 	struct sa_tag *stag;
 
 	/* Extract data */
 	NGI_GET_M(item, m);
 	NG_FREE_ITEM(item);
-
+#ifdef ALIGNED_POINTER
+	if (!ALIGNED_POINTER(mtod(m, caddr_t), uint32_t)) {
+		n = m_defrag(m, M_NOWAIT);
+		if (n == NULL) {
+			m_freem(m);
+			return (ENOBUFS);
+		}
+		m = n;
+	}
+#endif /* ALIGNED_POINTER */
 	/*
 	 * Look if socket address is stored in packet tags.
 	 * If sockaddr is ours, or provided by a third party (zero id),



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201003312216.o2VMG5L7038645>