ath9k_htc: memory corruption calling set_bit()
Subsystems (2)
PATCH 1/1 ath9k_htc: memory corruption calling set_bit()
In d8a2c51cdcae ('ath9k_htc: Use atomic operations for op_flags') we changed things like this:
- if (priv->op_flags & OP_TSF_RESET) {
+ if (test_bit(OP_TSF_RESET, &priv->op_flags)) {
The problem is that test_bit() takes a bit number and not a mask. It means that when we do:
set_bit(OP_TSF_RESET, &priv->op_flags);
Then it sets the (1 << 6) bit instead of the 6 bit so we are setting a bit which is past the end of the unsigned long.
---OP_TSF_RESET seems to be a write-only bit. Maybe we should just delete it?
drivers/net/wireless/ath/ath9k/htc.h +3 -3
@@ -440,9 +440,9 @@ static inline void ath9k_htc_stop_btcoex(struct ath9k_htc_priv *priv) }#endif /* CONFIG_ATH9K_BTCOEX_SUPPORT */ -#define OP_BT_PRIORITY_DETECTED BIT(3) -#define OP_BT_SCAN BIT(4) -#define OP_TSF_RESET BIT(6) +#define OP_BT_PRIORITY_DETECTED 3 +#define OP_BT_SCAN 4 +#define OP_TSF_RESET 6enum htc_op_flags {HTC_FWFLAG_NO_RMW ,
Kalle Valo
AppliedQuoted 10 lines
In
d8a2c51cdcae('ath9k_htc: Use atomic operations forop_flags') we changed things like this:(quoted diff) +1
-1- if (priv->op_flags & OP_TSF_RESET) { + if (test_bit(OP_TSF_RESET, &priv->op_flags)) {The problem is that
test_bit()takes a bit number and not a mask. It means that when we do:
Quoted 7 lines
set_bit(OP_TSF_RESET, &priv->op_flags);Then it sets the (1 << 6) bit instead of the 6 bit so we are setting a bit which is past the end of the unsigned long.
Fixes d8a2c51cdcae ('ath9k_htc: Use atomic operations for op_flags')Signed-off-by Dan Carpenter <[email protected]>
Thanks, applied to wireless-drivers-next.git.
Kalle Valo