diff options
author | mav <mav@FreeBSD.org> | 2010-03-31 22:16:05 +0000 |
---|---|---|
committer | mav <mav@FreeBSD.org> | 2010-03-31 22:16:05 +0000 |
commit | 07a4075f12377212e8bb32e0419ab0c75643c96a (patch) | |
tree | af8e48c4d628273cbdb723816c04c5d269ced636 | |
parent | e76e456d4730295cbbfeed281256c08878b58d3d (diff) | |
download | FreeBSD-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
-rw-r--r-- | sys/netgraph/ng_ksocket.c | 14 |
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), |