Skip to content

Commit a68292e

Browse files
Erick Archerrleon
authored andcommitted
net: mana: Avoid open coded arithmetic
This is an effort to get rid of all multiplications from allocation functions in order to prevent integer overflows [1][2]. As the "req" variable is a pointer to "struct mana_cfg_rx_steer_req_v2" and this structure ends in a flexible array: struct mana_cfg_rx_steer_req_v2 { [...] mana_handle_t indir_tab[] __counted_by(num_indir_entries); }; the preferred way in the kernel is to use the struct_size() helper to do the arithmetic instead of the calculation "size + size * count" in the kzalloc() function. Moreover, use the "offsetof" helper to get the indirect table offset instead of the "sizeof" operator and avoid the open-coded arithmetic in pointers using the new flex member. This new structure member also allow us to remove the "req_indir_tab" variable since it is no longer needed. Now, it is also possible to use the "flex_array_size" helper to compute the size of these trailing elements in the "memcpy" function. This way, the code is more readable and safer. This code was detected with the help of Coccinelle, and audited and modified manually. Link: https://www.kernel.org/doc/html/latest/process/deprecated.html#open-coded-arithmetic-in-allocator-arguments [1] Link: KSPP/linux#160 [2] Signed-off-by: Erick Archer <erick.archer@outlook.com> Link: https://lore.kernel.org/r/AS8PR02MB7237A21355C86EC0DCC0D83B8B022@AS8PR02MB7237.eurprd02.prod.outlook.com Reviewed-by: Justin Stitt <justinstitt@google.com> Signed-off-by: Leon Romanovsky <leon@kernel.org>
1 parent 29b8e13 commit a68292e

File tree

1 file changed

+6
-8
lines changed

1 file changed

+6
-8
lines changed

drivers/net/ethernet/microsoft/mana/mana_en.c

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1058,11 +1058,10 @@ static int mana_cfg_vport_steering(struct mana_port_context *apc,
10581058
struct mana_cfg_rx_steer_req_v2 *req;
10591059
struct mana_cfg_rx_steer_resp resp = {};
10601060
struct net_device *ndev = apc->ndev;
1061-
mana_handle_t *req_indir_tab;
10621061
u32 req_buf_size;
10631062
int err;
10641063

1065-
req_buf_size = sizeof(*req) + sizeof(mana_handle_t) * num_entries;
1064+
req_buf_size = struct_size(req, indir_tab, num_entries);
10661065
req = kzalloc(req_buf_size, GFP_KERNEL);
10671066
if (!req)
10681067
return -ENOMEM;
@@ -1074,7 +1073,8 @@ static int mana_cfg_vport_steering(struct mana_port_context *apc,
10741073

10751074
req->vport = apc->port_handle;
10761075
req->num_indir_entries = num_entries;
1077-
req->indir_tab_offset = sizeof(*req);
1076+
req->indir_tab_offset = offsetof(struct mana_cfg_rx_steer_req_v2,
1077+
indir_tab);
10781078
req->rx_enable = rx;
10791079
req->rss_enable = apc->rss_state;
10801080
req->update_default_rxobj = update_default_rxobj;
@@ -1086,11 +1086,9 @@ static int mana_cfg_vport_steering(struct mana_port_context *apc,
10861086
if (update_key)
10871087
memcpy(&req->hashkey, apc->hashkey, MANA_HASH_KEY_SIZE);
10881088

1089-
if (update_tab) {
1090-
req_indir_tab = (mana_handle_t *)(req + 1);
1091-
memcpy(req_indir_tab, apc->rxobj_table,
1092-
req->num_indir_entries * sizeof(mana_handle_t));
1093-
}
1089+
if (update_tab)
1090+
memcpy(req->indir_tab, apc->rxobj_table,
1091+
flex_array_size(req, indir_tab, req->num_indir_entries));
10941092

10951093
err = mana_send_request(apc->ac, req, req_buf_size, &resp,
10961094
sizeof(resp));

0 commit comments

Comments
 (0)