summaryrefslogtreecommitdiffstats
path: root/sys/dev/firewire/if_fwe.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/firewire/if_fwe.c')
-rw-r--r--sys/dev/firewire/if_fwe.c12
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
OpenPOWER on IntegriCloud