From: asmadeus@codewreck.org
To: Zhengchao Shao <shaozhengchao@huawei.com>
Cc: v9fs-developer@lists.sourceforge.net, netdev@vger.kernel.org,
ericvh@gmail.com, lucho@ionkov.net, linux_oss@crudebyte.com,
edumazet@google.com, kuba@kernel.org, pabeni@redhat.com,
weiyongjun1@huawei.com, yuehaibing@huawei.com
Subject: Re: [PATCH net] net/9p: fix issue of list_del corruption in p9_fd_cancel()
Date: Thu, 10 Nov 2022 21:51:39 +0900 [thread overview]
Message-ID: <Y2zz24jRIo9DdWw7@codewreck.org> (raw)
In-Reply-To: <20221110122606.383352-1-shaozhengchao@huawei.com>
Zhengchao Shao wrote on Thu, Nov 10, 2022 at 08:26:06PM +0800:
> Syz reported the following issue:
> kernel BUG at lib/list_debug.c:53!
> invalid opcode: 0000 [#1] PREEMPT SMP KASAN
> RIP: 0010:__list_del_entry_valid.cold+0x5c/0x72
> Call Trace:
> <TASK>
> p9_fd_cancel+0xb1/0x270
> p9_client_rpc+0x8ea/0xba0
> p9_client_create+0x9c0/0xed0
> v9fs_session_init+0x1e0/0x1620
> v9fs_mount+0xba/0xb80
> legacy_get_tree+0x103/0x200
> vfs_get_tree+0x89/0x2d0
> path_mount+0x4c0/0x1ac0
> __x64_sys_mount+0x33b/0x430
> do_syscall_64+0x35/0x80
> entry_SYSCALL_64_after_hwframe+0x46/0xb0
> </TASK>
>
> The process is as follows:
> Thread A: Thread B:
> p9_poll_workfn() p9_client_create()
> ... ...
> p9_conn_cancel() p9_fd_cancel()
> list_del() ...
> ... list_del() //list_del
> corruption
> There is no lock protection when deleting list in p9_conn_cancel(). After
> deleting list in Thread A, thread B will delete the same list again. It
> will cause issue of list_del corruption.
Thanks!
I'd add a couple of lines here describing the actual fix.
Something like this?
---
Setting req->status to REQ_STATUS_ERROR under lock prevents other
cleanup paths from trying to manipulate req_list.
The other thread can safely check req->status because it still holds a
reference to req at this point.
---
With that out of the way, it's a good idea; I didn't remember that
p9_fd_cancel (and cancelled) check for req status before acting on it.
This really feels like whack-a-mole, but I'd say this is one step
better.
Please tell me if you want to send a v2 with your words, or I'll just
pick this up with my suggestion and submit to Linus in a week-ish after
testing. No point in waiting a full cycle for this.
> Fixes: 52f1c45dde91 ("9p: trans_fd/p9_conn_cancel: drop client lock earlier")
> Reported-by: syzbot+9b69b8d10ab4a7d88056@syzkaller.appspotmail.com
> Signed-off-by: Zhengchao Shao <shaozhengchao@huawei.com>
> ---
> v2: set req status when removing list
(I don't recall seeing a v1?)
> ---
> net/9p/trans_fd.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/net/9p/trans_fd.c b/net/9p/trans_fd.c
> index 56a186768750..bd28e63d7666 100644
> --- a/net/9p/trans_fd.c
> +++ b/net/9p/trans_fd.c
> @@ -202,9 +202,11 @@ static void p9_conn_cancel(struct p9_conn *m, int err)
>
> list_for_each_entry_safe(req, rtmp, &m->req_list, req_list) {
> list_move(&req->req_list, &cancel_list);
> + req->status = REQ_STATUS_ERROR;
> }
> list_for_each_entry_safe(req, rtmp, &m->unsent_req_list, req_list) {
> list_move(&req->req_list, &cancel_list);
> + req->status = REQ_STATUS_ERROR;
> }
>
> spin_unlock(&m->req_lock);
--
Dominique
next prev parent reply other threads:[~2022-11-10 12:52 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-10 12:26 [PATCH net] net/9p: fix issue of list_del corruption in p9_fd_cancel() Zhengchao Shao
2022-11-10 12:51 ` asmadeus [this message]
2022-11-11 1:23 ` shaozhengchao
2022-11-11 2:12 ` asmadeus
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=Y2zz24jRIo9DdWw7@codewreck.org \
--to=asmadeus@codewreck.org \
--cc=edumazet@google.com \
--cc=ericvh@gmail.com \
--cc=kuba@kernel.org \
--cc=linux_oss@crudebyte.com \
--cc=lucho@ionkov.net \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=shaozhengchao@huawei.com \
--cc=v9fs-developer@lists.sourceforge.net \
--cc=weiyongjun1@huawei.com \
--cc=yuehaibing@huawei.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.