]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mlxsw: Warn about invalid accesses to array fields
authorPetr Machata <petrm@nvidia.com>
Mon, 8 Jul 2024 14:23:40 +0000 (16:23 +0200)
committerJakub Kicinski <kuba@kernel.org>
Wed, 10 Jul 2024 01:46:44 +0000 (18:46 -0700)
A forgotten or buggy variable initialization can cause out-of-bounds access
to a register or other item array field. For an overflow, such access would
mangle adjacent parts of the register payload. For an underflow, due to all
variables being unsigned, the access would likely trample unrelated memory.
Since neither is correct, replace these accesses with accesses at the index
of 0, and warn about the issue.

Suggested-by: Ido Schimmel <idosch@nvidia.com>
Signed-off-by: Petr Machata <petrm@nvidia.com>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Link: https://patch.msgid.link/b988fb265c2f6c1206fe12d5bfdcfa188b7672d1.1720447210.git.petrm@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlxsw/item.h

index cfafbeb425863037ca25ca356d44a191085ded7e..a619a0736bd1578e2e7f6f9292cddfc703efbfd8 100644 (file)
@@ -218,6 +218,10 @@ __mlxsw_item_bit_array_offset(const struct mlxsw_item *item,
        }
 
        max_index = (item->size.bytes << 3) / item->element_size - 1;
+       if (WARN_ONCE(index > max_index,
+                     "name=%s,index=%u,max_index=%u\n", item->name, index,
+                     max_index))
+               index = 0;
        be_index = max_index - index;
        offset = be_index * item->element_size >> 3;
        in_byte_index  = index % (BITS_PER_BYTE / item->element_size);