summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoryongari <yongari@FreeBSD.org>2010-08-23 21:40:03 +0000
committeryongari <yongari@FreeBSD.org>2010-08-23 21:40:03 +0000
commit6f3ab548394b6c8e84f1814149bebf98c6ad3db2 (patch)
tree1def6cd70da41d1b05f5747f8aeeff6360282d88
parent05b7de36b64f4178b61f8e1b8239c2f3e0be4fe3 (diff)
downloadFreeBSD-src-6f3ab548394b6c8e84f1814149bebf98c6ad3db2.zip
FreeBSD-src-6f3ab548394b6c8e84f1814149bebf98c6ad3db2.tar.gz
Fix a possible unaligned access to savebyte array.
PR: kern/122195
-rw-r--r--sys/dev/ed/if_ed.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/sys/dev/ed/if_ed.c b/sys/dev/ed/if_ed.c
index 839e2a5..6213ce7 100644
--- a/sys/dev/ed/if_ed.c
+++ b/sys/dev/ed/if_ed.c
@@ -1476,9 +1476,12 @@ ed_pio_write_mbufs(struct ed_softc *sc, struct mbuf *m, bus_size_t dst)
}
} else {
/* NE2000s are a pain */
- unsigned char *data;
+ uint8_t *data;
int len, wantbyte;
- unsigned char savebyte[2];
+ union {
+ uint16_t w;
+ uint8_t b[2];
+ } saveword;
wantbyte = 0;
@@ -1488,9 +1491,9 @@ ed_pio_write_mbufs(struct ed_softc *sc, struct mbuf *m, bus_size_t dst)
data = mtod(m, caddr_t);
/* finish the last word */
if (wantbyte) {
- savebyte[1] = *data;
+ saveword.b[1] = *data;
ed_asic_outw(sc, ED_NOVELL_DATA,
- *(u_short *)savebyte);
+ saveword.w);
data++;
len--;
wantbyte = 0;
@@ -1504,7 +1507,7 @@ ed_pio_write_mbufs(struct ed_softc *sc, struct mbuf *m, bus_size_t dst)
}
/* save last byte, if necessary */
if (len == 1) {
- savebyte[0] = *data;
+ saveword.b[0] = *data;
wantbyte = 1;
}
}
@@ -1512,7 +1515,7 @@ ed_pio_write_mbufs(struct ed_softc *sc, struct mbuf *m, bus_size_t dst)
}
/* spit last byte */
if (wantbyte)
- ed_asic_outw(sc, ED_NOVELL_DATA, *(u_short *)savebyte);
+ ed_asic_outw(sc, ED_NOVELL_DATA, saveword.w);
}
/*
OpenPOWER on IntegriCloud