Module Name: src Committed By: jmcneill Date: Fri Oct 20 23:38:21 UTC 2017
Modified Files: src/sys/dev/ic: bwfm.c Log Message: Fix an alignment problem with scan results within an escan event To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/sys/dev/ic/bwfm.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/ic/bwfm.c diff -u src/sys/dev/ic/bwfm.c:1.1 src/sys/dev/ic/bwfm.c:1.2 --- src/sys/dev/ic/bwfm.c:1.1 Thu Oct 19 23:58:41 2017 +++ src/sys/dev/ic/bwfm.c Fri Oct 20 23:38:21 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: bwfm.c,v 1.1 2017/10/19 23:58:41 jmcneill Exp $ */ +/* $NetBSD: bwfm.c,v 1.2 2017/10/20 23:38:21 jmcneill Exp $ */ /* $OpenBSD: bwfm.c,v 1.5 2017/10/16 22:27:16 patrick Exp $ */ /* * Copyright (c) 2010-2016 Broadcom Corporation @@ -1573,7 +1573,17 @@ bwfm_rx_event(struct bwfm_softc *sc, cha } bss = &res->bss_info[0]; for (i = 0; i < le16toh(res->bss_count); i++) { - bwfm_scan_node(sc, &res->bss_info[i], len); + /* Fix alignment of bss_info */ + union { + struct bwfm_bss_info bss_info; + uint8_t padding[BWFM_BSS_INFO_BUFLEN]; + } bss_buf; + if (len > sizeof(bss_buf)) { + printf("%s: bss_info buffer too big\n", DEVNAME(sc)); + } else { + memcpy(&bss_buf, &res->bss_info[i], len); + bwfm_scan_node(sc, &bss_buf.bss_info, len); + } len -= sizeof(*bss) + le32toh(bss->length); bss = (void *)(((uintptr_t)bss) + le32toh(bss->length)); if (len <= 0)