diff options
author | simokawa <simokawa@FreeBSD.org> | 2003-08-19 08:50:35 +0000 |
---|---|---|
committer | simokawa <simokawa@FreeBSD.org> | 2003-08-19 08:50:35 +0000 |
commit | 3f81cfafbe923e31e00218852c702f72d4d33c91 (patch) | |
tree | 0da6a7b74f6f56f6c7be8d723315d20dd84bfd58 | |
parent | c05232c451d50283b8904feb6a4c28d970180d37 (diff) | |
download | FreeBSD-src-3f81cfafbe923e31e00218852c702f72d4d33c91.zip FreeBSD-src-3f81cfafbe923e31e00218852c702f72d4d33c91.tar.gz |
Drop too short packets.
-rw-r--r-- | sys/dev/firewire/if_fwe.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/sys/dev/firewire/if_fwe.c b/sys/dev/firewire/if_fwe.c index 7d74809..3eddef7 100644 --- a/sys/dev/firewire/if_fwe.c +++ b/sys/dev/firewire/if_fwe.c @@ -575,15 +575,12 @@ fwe_as_input(struct fw_xferq *xferq) #endif while ((sxfer = STAILQ_FIRST(&xferq->stvalid)) != NULL) { STAILQ_REMOVE_HEAD(&xferq->stvalid, link); - if (sxfer->resp != 0) - ifp->if_ierrors ++; fp = mtod(sxfer->mbuf, struct fw_pkt *); - /* XXX */ if (fwe->fd.fc->irx_post != NULL) fwe->fd.fc->irx_post(fwe->fd.fc, fp->mode.ld); m = sxfer->mbuf; - /* insert rbuf */ + /* insert new rbuf */ sxfer->mbuf = m0 = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); if (m0 != NULL) { m0->m_len = m0->m_pkthdr.len = m0->m_ext.ext_size; @@ -591,6 +588,13 @@ fwe_as_input(struct fw_xferq *xferq) } else printf("fwe_as_input: m_getcl failed\n"); + if (sxfer->resp != 0 || fp->mode.stream.len < + ETHER_ALIGN + sizeof(struct ether_header)) { + m_freem(m); + ifp->if_ierrors ++; + continue; + } + m->m_data += HDR_LEN + ETHER_ALIGN; c = mtod(m, char *); #if __FreeBSD_version < 500000 |