| From 224dcc81ef9b5044dbabc698ec63437d3413e41c Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 30 Jul 2020 18:29:41 +0800 |
| Subject: net/mlx5e: fix bpf_prog reference count leaks in mlx5e_alloc_rq |
| |
| From: Xin Xiong <xiongx18@fudan.edu.cn> |
| |
| [ Upstream commit e692139e6af339a1495ef401b2d95f7f9d1c7a44 ] |
| |
| The function invokes bpf_prog_inc(), which increases the reference |
| count of a bpf_prog object "rq->xdp_prog" if the object isn't NULL. |
| |
| The refcount leak issues take place in two error handling paths. When |
| either mlx5_wq_ll_create() or mlx5_wq_cyc_create() fails, the function |
| simply returns the error code and forgets to drop the reference count |
| increased earlier, causing a reference count leak of "rq->xdp_prog". |
| |
| Fix this issue by jumping to the error handling path err_rq_wq_destroy |
| while either function fails. |
| |
| Fixes: 422d4c401edd ("net/mlx5e: RX, Split WQ objects for different RQ types") |
| Signed-off-by: Xin Xiong <xiongx18@fudan.edu.cn> |
| Signed-off-by: Xiyu Yang <xiyuyang19@fudan.edu.cn> |
| Signed-off-by: Xin Tan <tanxin.ctf@gmail.com> |
| Signed-off-by: Saeed Mahameed <saeedm@mellanox.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c |
| index 7e6706333fa8d..51edc507b7b5d 100644 |
| --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c |
| +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c |
| @@ -519,7 +519,7 @@ static int mlx5e_alloc_rq(struct mlx5e_channel *c, |
| err = mlx5_wq_ll_create(mdev, &rqp->wq, rqc_wq, &rq->mpwqe.wq, |
| &rq->wq_ctrl); |
| if (err) |
| - return err; |
| + goto err_rq_wq_destroy; |
| |
| rq->mpwqe.wq.db = &rq->mpwqe.wq.db[MLX5_RCV_DBR]; |
| |
| @@ -564,7 +564,7 @@ static int mlx5e_alloc_rq(struct mlx5e_channel *c, |
| err = mlx5_wq_cyc_create(mdev, &rqp->wq, rqc_wq, &rq->wqe.wq, |
| &rq->wq_ctrl); |
| if (err) |
| - return err; |
| + goto err_rq_wq_destroy; |
| |
| rq->wqe.wq.db = &rq->wqe.wq.db[MLX5_RCV_DBR]; |
| |
| -- |
| 2.25.1 |
| |