From: LinMa <linma@zju.edu.cn>
To: "Tetsuo Handa" <penguin-kernel@i-love.sakura.ne.jp>
Cc: "Luiz Augusto von Dentz" <luiz.dentz@gmail.com>,
"Marcel Holtmann" <marcel@holtmann.org>,
"Johan Hedberg" <johan.hedberg@gmail.com>,
"linux-bluetooth@vger.kernel.org"
<linux-bluetooth@vger.kernel.org>,
"David S. Miller" <davem@davemloft.net>,
"Jakub Kicinski" <kuba@kernel.org>,
"open list:NETWORKING [GENERAL]" <netdev@vger.kernel.org>
Subject: Re: Re: [PATCH v2] Bluetooth: call lock_sock() outside of spinlock section
Date: Thu, 8 Jul 2021 09:00:41 +0800 (GMT+08:00) [thread overview]
Message-ID: <5c823fa2.353ff.17a83a190e2.Coremail.linma@zju.edu.cn> (raw)
In-Reply-To: <79694c01-b69e-a039-6860-d7e612fbc008@i-love.sakura.ne.jp>
>
> diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c
> index b04a5a02ecf3..0525883f4639 100644
> --- a/net/bluetooth/hci_sock.c
> +++ b/net/bluetooth/hci_sock.c
> @@ -759,19 +759,14 @@ void hci_sock_dev_event(struct hci_dev *hdev, int event)
> if (event == HCI_DEV_UNREG) {
> struct sock *sk;
>
> - /* Detach sockets from device */
> + /* Change socket state and notify */
> read_lock(&hci_sk_list.lock);
> sk_for_each(sk, &hci_sk_list.head) {
> - lock_sock(sk);
> if (hci_pi(sk)->hdev == hdev) {
> - hci_pi(sk)->hdev = NULL;
> sk->sk_err = EPIPE;
> sk->sk_state = BT_OPEN;
> sk->sk_state_change(sk);
> -
> - hci_dev_put(hdev);
> }
> - release_sock(sk);
> }
> read_unlock(&hci_sk_list.lock);
> }
>
> ? I can't judge because I don't know how this works. I worry that
> without lock_sock()/release_sock(), this races with e.g. hci_sock_bind().
>
> We could take away the backward goto if we can do something like below.
>
> diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c
> index b04a5a02ecf3..1ca03769badf 100644
> --- a/net/bluetooth/hci_sock.c
> +++ b/net/bluetooth/hci_sock.c
> @@ -43,6 +43,8 @@ static DEFINE_IDA(sock_cookie_ida);
>
> static atomic_t monitor_promisc = ATOMIC_INIT(0);
>
> +static DEFINE_MUTEX(sock_list_lock);
> +
> /* ----- HCI socket interface ----- */
>
> /* Socket info */
> @@ -760,7 +762,7 @@ void hci_sock_dev_event(struct hci_dev *hdev, int event)
> struct sock *sk;
>
> /* Detach sockets from device */
> - read_lock(&hci_sk_list.lock);
> + mutex_lock(&sock_list_lock);
> sk_for_each(sk, &hci_sk_list.head) {
> lock_sock(sk);
> if (hci_pi(sk)->hdev == hdev) {
> @@ -773,7 +775,7 @@ void hci_sock_dev_event(struct hci_dev *hdev, int event)
> }
> release_sock(sk);
> }
> - read_unlock(&hci_sk_list.lock);
> + mutex_unlock(&sock_list_lock);
> }
> }
>
> @@ -838,6 +840,7 @@ static int hci_sock_release(struct socket *sock)
> if (!sk)
> return 0;
>
> + mutex_lock(&sock_list_lock);
> lock_sock(sk);
>
> switch (hci_pi(sk)->channel) {
> @@ -860,6 +863,7 @@ static int hci_sock_release(struct socket *sock)
> }
>
> bt_sock_unlink(&hci_sk_list, sk);
> + mutex_unlock(&sock_list_lock);
>
> hdev = hci_pi(sk)->hdev;
> if (hdev) {
> @@ -2049,7 +2053,9 @@ static int hci_sock_create(struct net *net, struct socket *sock, int protocol,
> sock->state = SS_UNCONNECTED;
> sk->sk_state = BT_OPEN;
>
> + mutex_lock(&sock_list_lock);
> bt_sock_link(&hci_sk_list, sk);
> + mutex_unlock(&sock_list_lock);
> return 0;
> }
>
>
> > It is also weird that this only manifests in the Bluetooth
> > HCI sockets or other subsystems don't use such locking mechanism
> > anymore?
>
Hello Tetsuo,
Yeah, that's a great patch indeed. Add one extra mutex lock for handling this.
In fact, I have tried to replace all the hci_sk_list.lock from rwlock_t to mutext.
> https://patchwork.kernel.org/project/bluetooth/patch/CAJjojJsj9pzF4j2MVvsM-hCpvyR7OkZn232yt3MdOGnLxOiRRg@mail.gmail.com/
> However, from the lock principle in the Linux kernel, this lock
> replacement is not appropriate. I take a lot of time to try with other
> lock combinations for this case but failed. For example, I tried to
> replace the rwlock_t in the hci_sk_list with a sleep-able mutex lock.
Because I have seem other part of code in kernel uses this combination: mutex_t + lock_sock. It shouldn't trigger any locking errors. (Will test it)
> Also, this regression is currently 7th top
> crashers for syzbot, and I'd like to apply this patch as soon as possible.
>
XD, Yeah. Because the bug crash point is located at function hci_sock_dev_event(). Whenever syzkaller fuzzes Bluetooth stack and the executor exits, the crash happens.
> I think that this patch can serve as a response to Lin's comment
> > In short, I have no idea if there is any lock replacing solution for
> > this bug. I need help and suggestions because the lock mechanism is
> > just so difficult.
Thanks for that, it's quite appreciating.
Regards
Lin Ma
next prev parent reply other threads:[~2021-07-08 1:00 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-27 13:11 [PATCH] Bluetooth: call lock_sock() outside of spinlock section Tetsuo Handa
2021-06-27 14:05 ` bluez.test.bot
2021-07-07 9:43 ` [PATCH v2] " Tetsuo Handa
2021-07-07 10:08 ` [v2] " bluez.test.bot
2021-07-07 18:20 ` [PATCH v2] " Luiz Augusto von Dentz
2021-07-07 23:33 ` Tetsuo Handa
2021-07-08 1:00 ` LinMa [this message]
2021-07-09 13:50 ` Tetsuo Handa
2021-07-10 13:34 ` Tetsuo Handa
2021-07-08 7:16 ` [v2] " bluez.test.bot
2021-07-13 11:27 ` [PATCH v3] " Tetsuo Handa
2021-07-13 11:57 ` [v3] " bluez.test.bot
2021-07-14 19:20 ` [PATCH v3] " Luiz Augusto von Dentz
2021-07-15 3:03 ` LinMa
2021-07-16 3:47 ` Desmond Cheong Zhi Xi
2021-07-16 4:11 ` Desmond Cheong Zhi Xi
2021-07-16 14:48 ` Tetsuo Handa
2021-07-16 15:26 ` LinMa
2021-07-17 15:41 ` Yet Another Patch for CVE-2021-3573 LinMa
2021-07-17 15:45 ` LinMa
2021-07-22 9:36 ` [PATCH v3] Bluetooth: call lock_sock() outside of spinlock section Tetsuo Handa
2021-07-22 4:47 ` LinMa
2021-07-22 5:16 ` Tetsuo Handa
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=5c823fa2.353ff.17a83a190e2.Coremail.linma@zju.edu.cn \
--to=linma@zju.edu.cn \
--cc=davem@davemloft.net \
--cc=johan.hedberg@gmail.com \
--cc=kuba@kernel.org \
--cc=linux-bluetooth@vger.kernel.org \
--cc=luiz.dentz@gmail.com \
--cc=marcel@holtmann.org \
--cc=netdev@vger.kernel.org \
--cc=penguin-kernel@i-love.sakura.ne.jp \
/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.