[dpdk-dev] [PATCH] net/sfc: fix passing wrong buffer size
From: Ivan Malov <hidden>
Date: 2021-02-26 14:10:51
Subsystem:
networking drivers, the rest · Maintainers:
Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds
Pass the size of the buffer where the item's mask
is stored and not the indirection pointer size.
Coverity issue: 363735
Fixes: dadff137931c ("net/sfc: support encap flow items in transfer rules")
Cc: stable@dpdk.org
Signed-off-by: Ivan Malov <redacted>
Reviewed-by: Andrew Rybchenko <redacted>
Reviewed-by: Andy Moreton <redacted>
---
drivers/net/sfc/sfc_mae.c | 20 +++++++++-----------
drivers/net/sfc/sfc_mae.h | 3 ++-
2 files changed, 11 insertions(+), 12 deletions(-)
diff --git a/drivers/net/sfc/sfc_mae.c b/drivers/net/sfc/sfc_mae.c
index 7deccc9c60..7189a34140 100644
--- a/drivers/net/sfc/sfc_mae.c
+++ b/drivers/net/sfc/sfc_mae.c@@ -1696,7 +1696,6 @@ sfc_mae_rule_parse_item_tunnel(const struct rte_flow_item *item, uint8_t supp_mask[sizeof(uint64_t)]; const uint8_t *spec = NULL; const uint8_t *mask = NULL; - const void *def_mask; int rc; /*
@@ -1718,12 +1717,11 @@ sfc_mae_rule_parse_item_tunnel(const struct rte_flow_item *item, * sfc_mae_rule_encap_parse_init(). Default mask * was also picked by that helper. Use it here. */ - def_mask = ctx_mae->tunnel_def_mask; - rc = sfc_flow_parse_init(item, (const void **)&spec, (const void **)&mask, - (const void *)&supp_mask, def_mask, - sizeof(def_mask), error); + (const void *)&supp_mask, + ctx_mae->tunnel_def_mask, + ctx_mae->tunnel_def_mask_size, error); if (rc != 0) return rc;
@@ -1957,20 +1955,20 @@ sfc_mae_rule_encap_parse_init(struct sfc_adapter *sa, case RTE_FLOW_ITEM_TYPE_VXLAN: ctx->encap_type = EFX_TUNNEL_PROTOCOL_VXLAN; ctx->tunnel_def_mask = &rte_flow_item_vxlan_mask; - RTE_BUILD_BUG_ON(sizeof(ctx->tunnel_def_mask) != - sizeof(rte_flow_item_vxlan_mask)); + ctx->tunnel_def_mask_size = + sizeof(rte_flow_item_vxlan_mask); break; case RTE_FLOW_ITEM_TYPE_GENEVE: ctx->encap_type = EFX_TUNNEL_PROTOCOL_GENEVE; ctx->tunnel_def_mask = &rte_flow_item_geneve_mask; - RTE_BUILD_BUG_ON(sizeof(ctx->tunnel_def_mask) != - sizeof(rte_flow_item_geneve_mask)); + ctx->tunnel_def_mask_size = + sizeof(rte_flow_item_geneve_mask); break; case RTE_FLOW_ITEM_TYPE_NVGRE: ctx->encap_type = EFX_TUNNEL_PROTOCOL_NVGRE; ctx->tunnel_def_mask = &rte_flow_item_nvgre_mask; - RTE_BUILD_BUG_ON(sizeof(ctx->tunnel_def_mask) != - sizeof(rte_flow_item_nvgre_mask)); + ctx->tunnel_def_mask_size = + sizeof(rte_flow_item_nvgre_mask); break; case RTE_FLOW_ITEM_TYPE_END: break;
diff --git a/drivers/net/sfc/sfc_mae.h b/drivers/net/sfc/sfc_mae.h
index 2822afce31..cbe4fd8e9f 100644
--- a/drivers/net/sfc/sfc_mae.h
+++ b/drivers/net/sfc/sfc_mae.h@@ -274,7 +274,8 @@ struct sfc_mae_parse_ctx { * which part of the pattern is being parsed. */ const efx_mae_field_id_t *field_ids_remap; - /* This points to a tunnel-specific default mask. */ + /* These two fields correspond to the tunnel-specific default mask. */ + size_t tunnel_def_mask_size; const void *tunnel_def_mask; bool match_mport_set; struct sfc_mae_pattern_data pattern_data;
--
2.20.1