2021-02-12 10:26:23

by Johannes Berg

[permalink] [raw]
Subject: [PATCH] mac80211: fix rate mask reset

From: Johannes Berg <[email protected]>

Coverity reported the strange "if (~...)" condition that's
always true. It suggested that ! was intended instead of ~,
but upon further analysis I'm convinced that what really was
intended was a comparison to 0xff/0xffff (in HT/VHT cases
respectively), since this indicates that all of the rates
are enabled.

Change the comparison accordingly.

I'm guessing this never really mattered because a reset to
not having a rate mask is basically equivalent to having a
mask that enables all rates.

Reported-by: Colin Ian King <[email protected]>
Fixes: 2ffbe6d33366 ("mac80211: fix and optimize MCS mask handling")
Fixes: b119ad6e726c ("mac80211: add rate mask logic for vht rates")
Signed-off-by: Johannes Berg <[email protected]>
---
net/mac80211/cfg.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index c4c70e30ad7f..68a0de02b561 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -2950,14 +2950,14 @@ static int ieee80211_set_bitrate_mask(struct wiphy *wiphy,
continue;

for (j = 0; j < IEEE80211_HT_MCS_MASK_LEN; j++) {
- if (~sdata->rc_rateidx_mcs_mask[i][j]) {
+ if (sdata->rc_rateidx_mcs_mask[i][j] != 0xff) {
sdata->rc_has_mcs_mask[i] = true;
break;
}
}

for (j = 0; j < NL80211_VHT_NSS_MAX; j++) {
- if (~sdata->rc_rateidx_vht_mcs_mask[i][j]) {
+ if (sdata->rc_rateidx_vht_mcs_mask[i][j] != 0xffff) {
sdata->rc_has_vht_mcs_mask[i] = true;
break;
}
--
2.26.2


2021-02-12 10:36:10

by Colin King

[permalink] [raw]
Subject: Re: [PATCH] mac80211: fix rate mask reset

On 12/02/2021 10:22, Johannes Berg wrote:
> From: Johannes Berg <[email protected]>
>
> Coverity reported the strange "if (~...)" condition that's
> always true. It suggested that ! was intended instead of ~,
> but upon further analysis I'm convinced that what really was
> intended was a comparison to 0xff/0xffff (in HT/VHT cases
> respectively), since this indicates that all of the rates
> are enabled.
>
> Change the comparison accordingly.
>
> I'm guessing this never really mattered because a reset to
> not having a rate mask is basically equivalent to having a
> mask that enables all rates.
>
> Reported-by: Colin Ian King <[email protected]>
> Fixes: 2ffbe6d33366 ("mac80211: fix and optimize MCS mask handling")
> Fixes: b119ad6e726c ("mac80211: add rate mask logic for vht rates")
> Signed-off-by: Johannes Berg <[email protected]>
> ---
> net/mac80211/cfg.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
> index c4c70e30ad7f..68a0de02b561 100644
> --- a/net/mac80211/cfg.c
> +++ b/net/mac80211/cfg.c
> @@ -2950,14 +2950,14 @@ static int ieee80211_set_bitrate_mask(struct wiphy *wiphy,
> continue;
>
> for (j = 0; j < IEEE80211_HT_MCS_MASK_LEN; j++) {
> - if (~sdata->rc_rateidx_mcs_mask[i][j]) {
> + if (sdata->rc_rateidx_mcs_mask[i][j] != 0xff) {
> sdata->rc_has_mcs_mask[i] = true;
> break;
> }
> }
>
> for (j = 0; j < NL80211_VHT_NSS_MAX; j++) {
> - if (~sdata->rc_rateidx_vht_mcs_mask[i][j]) {
> + if (sdata->rc_rateidx_vht_mcs_mask[i][j] != 0xffff) {
> sdata->rc_has_vht_mcs_mask[i] = true;
> break;
> }
>

Looks good to me, thanks Johannes.

Reviewed-by: Colin Ian King <[email protected]>