On Tue, Jul 27, 2021 at 01:58:30PM -0700, Kees Cook wrote: > In preparation for FORTIFY_SOURCE performing compile-time and run-time > field bounds checking for memset(), avoid intentionally writing across > neighboring fields. > > Use memset_after() so memset() doesn't get confused about writing > beyond the destination member that is intended to be the starting point > of zeroing through the end of the struct. > > Note that the common helper, ieee80211_tx_info_clear_status(), does NOT > clear ack_signal, but the open-coded versions do. All three perform > checks that the ack_signal position hasn't changed, though. Quick ping on this question: there is a mismatch between the common helper and the other places that do this. Is there a bug here? > > Signed-off-by: Kees Cook <keescook@xxxxxxxxxxxx> > --- > Should these each be clearing the same region? Because they're currently not. > --- > drivers/net/wireless/ath/carl9170/tx.c | 4 +--- > drivers/net/wireless/intersil/p54/txrx.c | 4 +--- > include/net/mac80211.h | 4 +--- > 3 files changed, 3 insertions(+), 9 deletions(-) > > diff --git a/drivers/net/wireless/ath/carl9170/tx.c b/drivers/net/wireless/ath/carl9170/tx.c > index 88444fe6d1c6..6d2115639434 100644 > --- a/drivers/net/wireless/ath/carl9170/tx.c > +++ b/drivers/net/wireless/ath/carl9170/tx.c > @@ -278,9 +278,7 @@ static void carl9170_tx_release(struct kref *ref) > BUILD_BUG_ON( > offsetof(struct ieee80211_tx_info, status.ack_signal) != 20); > > - memset(&txinfo->status.ack_signal, 0, > - sizeof(struct ieee80211_tx_info) - > - offsetof(struct ieee80211_tx_info, status.ack_signal)); > + memset_after(&txinfo->status, 0, rates); > > if (atomic_read(&ar->tx_total_queued)) > ar->tx_schedule = true; > diff --git a/drivers/net/wireless/intersil/p54/txrx.c b/drivers/net/wireless/intersil/p54/txrx.c > index 873fea59894f..f71b355f8583 100644 > --- a/drivers/net/wireless/intersil/p54/txrx.c > +++ b/drivers/net/wireless/intersil/p54/txrx.c > @@ -431,9 +431,7 @@ static void p54_rx_frame_sent(struct p54_common *priv, struct sk_buff *skb) > * Clear manually, ieee80211_tx_info_clear_status would > * clear the counts too and we need them. > */ > - memset(&info->status.ack_signal, 0, > - sizeof(struct ieee80211_tx_info) - > - offsetof(struct ieee80211_tx_info, status.ack_signal)); > + memset_after(&info->status, 0, rates); > BUILD_BUG_ON(offsetof(struct ieee80211_tx_info, > status.ack_signal) != 20); > > diff --git a/include/net/mac80211.h b/include/net/mac80211.h > index d8a1d09a2141..7abc1427aa8c 100644 > --- a/include/net/mac80211.h > +++ b/include/net/mac80211.h > @@ -1200,9 +1200,7 @@ ieee80211_tx_info_clear_status(struct ieee80211_tx_info *info) > > BUILD_BUG_ON( > offsetof(struct ieee80211_tx_info, status.ack_signal) != 20); > - memset(&info->status.ampdu_ack_len, 0, > - sizeof(struct ieee80211_tx_info) - > - offsetof(struct ieee80211_tx_info, status.ampdu_ack_len)); > + memset_after(&info->status, 0, ack_signal); > } > > > -- > 2.30.2 > -- Kees Cook