Skip to content

Commit 6699170

Browse files
mkubecekdavem330
authored andcommitted
ethtool: fix application of verbose no_mask bitset
A bitset without mask in a _SET request means we want exactly the bits in the bitset to be set. This works correctly for compact format but when verbose format is parsed, ethnl_update_bitset32_verbose() only sets the bits present in the request bitset but does not clear the rest. This can cause incorrect results like lion:~ # ethtool eth0 | grep Wake Supports Wake-on: pumbg Wake-on: g lion:~ # ethtool -s eth0 wol u lion:~ # ethtool eth0 | grep Wake Supports Wake-on: pumbg Wake-on: ug when the second ethtool command issues request ETHTOOL_MSG_WOL_SET ETHTOOL_A_WOL_HEADER ETHTOOL_A_HEADER_DEV_NAME = "eth0" ETHTOOL_A_WOL_MODES ETHTOOL_A_BITSET_NOMASK ETHTOOL_A_BITSET_BITS ETHTOOL_A_BITSET_BITS_BIT ETHTOOL_BITSET_BIT_INDEX = 1 Fix the logic by clearing the whole target bitmap before we start iterating through the request bits. Fixes: 10b518d ("ethtool: netlink bitset handling") Signed-off-by: Michal Kubecek <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent d965a54 commit 6699170

File tree

1 file changed

+3
-0
lines changed

1 file changed

+3
-0
lines changed

net/ethtool/bitset.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,10 @@ ethnl_update_bitset32_verbose(u32 *bitmap, unsigned int nbits,
447447
"mask only allowed in compact bitset");
448448
return -EINVAL;
449449
}
450+
450451
no_mask = tb[ETHTOOL_A_BITSET_NOMASK];
452+
if (no_mask)
453+
ethnl_bitmap32_clear(bitmap, 0, nbits, mod);
451454

452455
nla_for_each_nested(bit_attr, tb[ETHTOOL_A_BITSET_BITS], rem) {
453456
bool old_val, new_val;

0 commit comments

Comments
 (0)