All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jakub Kicinski <kuba@kernel.org>
To: Duoming Zhou <duoming@zju.edu.cn>
Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
	pabeni@redhat.com, edumazet@google.com, davem@davemloft.net,
	andrew+netdev@lunn.ch
Subject: Re: [PATCH v2 net] cnic: Fix use-after-free bugs in cnic_delete_task
Date: Tue, 16 Sep 2025 07:28:36 -0700	[thread overview]
Message-ID: <20250916072836.239631ef@kernel.org> (raw)
In-Reply-To: <20250916130818.13617-1-duoming@zju.edu.cn>

On Tue, 16 Sep 2025 21:08:18 +0800 Duoming Zhou wrote:
> The original code uses cancel_delayed_work() in cnic_cm_stop_bnx2x_hw(),
> which does not guarantee that the delayed work item 'delete_task' has
> fully completed if it was already running. Additionally, the delayed work
> item is cyclic, the flush_workqueue() in cnic_cm_stop_bnx2x_hw() only
> blocks and waits for work items that were already queued to the
> workqueue prior to its invocation. Any work items submitted after
> flush_workqueue() is called are not included in the set of tasks that the
> flush operation awaits. This means that after the cyclic work items have
> finished executing, a delayed work item may still exist in the workqueue.
> This leads to use-after-free scenarios where the cnic_dev is deallocated
> by cnic_free_dev(), while delete_task remains active and attempt to
> dereference cnic_dev in cnic_delete_task().
> 
> A typical race condition is illustrated below:
> 
> CPU 0 (cleanup)              | CPU 1 (delayed work callback)
> cnic_netdev_event()          |
>   cnic_stop_hw()             | cnic_delete_task()
>     cnic_cm_stop_bnx2x_hw()  | ...
>       cancel_delayed_work()  | /* the queue_delayed_work()
>       flush_workqueue()      |    executes after flush_workqueue()*/
>                              | queue_delayed_work()
>   cnic_free_dev(dev)//free   | cnic_delete_task() //new instance
>                              |   dev = cp->dev; //use
> 
> Replace cancel_delayed_work() with cancel_delayed_work_sync() to ensure
> that the cyclic delayed work item is properly canceled and any executing
> delayed work has finished before the cnic_dev is deallocated.

Once again, you must include how you discovered and tested the patch
in the commit message.

> Fixes: fdf24086f475 ("cnic: Defer iscsi connection cleanup")
> Signed-off-by: Duoming Zhou <duoming@zju.edu.cn>
> ---
> Changes in v2:
>   - Make commit messages more clearer.
> 
>  drivers/net/ethernet/broadcom/cnic.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/net/ethernet/broadcom/cnic.c b/drivers/net/ethernet/broadcom/cnic.c
> index a9040c42d2ff..73dd7c25d89e 100644
> --- a/drivers/net/ethernet/broadcom/cnic.c
> +++ b/drivers/net/ethernet/broadcom/cnic.c
> @@ -4230,7 +4230,7 @@ static void cnic_cm_stop_bnx2x_hw(struct cnic_dev *dev)
>  
>  	cnic_bnx2x_delete_wait(dev, 0);
>  
> -	cancel_delayed_work(&cp->delete_task);
> +	cancel_delayed_work_sync(&cp->delete_task);
>  	flush_workqueue(cnic_wq);

You should delete the flush, it was supposed to prevent the issue
you're now resolving with the _sync().

>  	if (atomic_read(&cp->iscsi_conn) != 0)


      reply	other threads:[~2025-09-16 14:28 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-09-16 13:08 [PATCH v2 net] cnic: Fix use-after-free bugs in cnic_delete_task Duoming Zhou
2025-09-16 14:28 ` Jakub Kicinski [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250916072836.239631ef@kernel.org \
    --to=kuba@kernel.org \
    --cc=andrew+netdev@lunn.ch \
    --cc=davem@davemloft.net \
    --cc=duoming@zju.edu.cn \
    --cc=edumazet@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.