FAILED: patch "[PATCH] net/mlx5e: Fix nullptr in mlx5e_tc_add_fdb_flow()" failed to apply to 4.14-stable tree
[email protected]
maintainerThe patch below does not apply to the 4.14-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From fe7738eb3ca3631a75844e790f6cb576c0fe7b00 Mon Sep 17 00:00:00 2001
From: Dima Chumak <[email protected]>
Date: Mon, 26 Apr 2021 15:16:26 +0300
Subject: [PATCH] net/mlx5e: Fix nullptr in mlx5e_tc_add_fdb_flow()
The result of __dev_get_by_index() is not checked for NULL, which then passed to mlx5e_attach_encap() and gets dereferenced.
Also, in case of a successful lookup, the net_device reference count is not incremented, which may result in net_device pointer becoming invalid at any time during mlx5e_attach_encap() execution.
Fix by using dev_get_by_index(), which does proper reference counting on the net_device pointer. Also, handle nullptr return value when mirred device is not found.
It's safe to call dev_put() on the mirred net_device pointer, right after mlx5e_attach_encap() call, because it's not being saved/copied down the call chain.
Addresses-Coverity: ("Dereference null return value")
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +9 -3
@@ -1322,10 +1322,10 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv, struct netlink_ext_ack *extack) {struct mlx5_eswitch *esw = priv->mdev->priv.eswitch; -struct net_device *out_dev, *encap_dev =NULL ;struct mlx5e_tc_flow_parse_attr *parse_attr;struct mlx5_flow_attr *attr = flow->attr;bool vf_tun = false, encap_valid = true; +struct net_device *encap_dev =NULL ;struct mlx5_esw_flow_attr *esw_attr;struct mlx5_fc *counter =NULL ;struct mlx5e_rep_priv *rpriv;
@@ -1371,16 +1371,22 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv, esw_attr = attr->esw_attr;for (out_index =0 ; out_index <MLX5_MAX_FLOW_FWD_VPORTS ; out_index++) { +struct net_device *out_dev;int mirred_ifindex;if (!(esw_attr->dests[out_index].flags &MLX5_ESW_DEST_ENCAP ))continue ; mirred_ifindex = parse_attr->mirred_ifindex[out_index]; - out_dev =__dev_get_by_index (dev_net (priv->netdev), - mirred_ifindex); + out_dev =dev_get_by_index (dev_net (priv->netdev), mirred_ifindex); +if (!out_dev) { +NL_SET_ERR_MSG_MOD (extack,"Requested mirred device not found" ); + err = -ENODEV ; + goto err_out; + } err =mlx5e_attach_encap (priv, flow, out_dev, out_index, extack, &encap_dev, &encap_valid); +dev_put (out_dev);if (err) goto err_out;