summaryrefslogtreecommitdiffstats
path: root/sys/netgraph/ng_ksocket.c
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2010-03-31 22:16:05 +0000
committermav <mav@FreeBSD.org>2010-03-31 22:16:05 +0000
commit07a4075f12377212e8bb32e0419ab0c75643c96a (patch)
treeaf8e48c4d628273cbdb723816c04c5d269ced636 /sys/netgraph/ng_ksocket.c
parente76e456d4730295cbbfeed281256c08878b58d3d (diff)
downloadFreeBSD-src-07a4075f12377212e8bb32e0419ab0c75643c96a.zip
FreeBSD-src-07a4075f12377212e8bb32e0419ab0c75643c96a.tar.gz
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
Diffstat (limited to 'sys/netgraph/ng_ksocket.c')
-rw-r--r--sys/netgraph/ng_ksocket.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/sys/netgraph/ng_ksocket.c b/sys/netgraph/ng_ksocket.c
index d1571b1..260eba9 100644
--- a/sys/netgraph/ng_ksocket.c
+++ b/sys/netgraph/ng_ksocket.c
@@ -902,12 +902,24 @@ ng_ksocket_rcvdata(hook_p hook, item_p item)
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),
OpenPOWER on IntegriCloud