lkml.org 
[lkml]   [2022]   [Oct]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 6.0 325/862] Bluetooth: Prevent double register of suspend
    Date
    From: Abhishek Pandit-Subedi <abhishekpandit@chromium.org>

    [ Upstream commit 4b8af331bb4d4cc8bb91c284b11b98dd1e265185 ]

    Suspend notifier should only be registered and unregistered once per
    hdev. Simplify this by only registering during driver registration and
    simply exiting early when HCI_USER_CHANNEL is set.

    Reported-by: syzbot <syzkaller@googlegroups.com>
    Fixes: 359ee4f834f5 (Bluetooth: Unregister suspend with userchannel)
    Signed-off-by: Abhishek Pandit-Subedi <abhishekpandit@chromium.org>
    Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    net/bluetooth/hci_core.c | 4 ++++
    net/bluetooth/hci_sock.c | 3 ---
    2 files changed, 4 insertions(+), 3 deletions(-)

    diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
    index e6be18eb7fe6..6ae5aa5c0927 100644
    --- a/net/bluetooth/hci_core.c
    +++ b/net/bluetooth/hci_core.c
    @@ -2400,6 +2400,10 @@ static int hci_suspend_notifier(struct notifier_block *nb, unsigned long action,
    container_of(nb, struct hci_dev, suspend_notifier);
    int ret = 0;

    + /* Userspace has full control of this device. Do nothing. */
    + if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL))
    + return NOTIFY_DONE;
    +
    if (action == PM_SUSPEND_PREPARE)
    ret = hci_suspend_dev(hdev);
    else if (action == PM_POST_SUSPEND)
    diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c
    index 0d015d4a8e41..bd8358b44aa4 100644
    --- a/net/bluetooth/hci_sock.c
    +++ b/net/bluetooth/hci_sock.c
    @@ -887,7 +887,6 @@ static int hci_sock_release(struct socket *sock)
    */
    hci_dev_do_close(hdev);
    hci_dev_clear_flag(hdev, HCI_USER_CHANNEL);
    - hci_register_suspend_notifier(hdev);
    mgmt_index_added(hdev);
    }

    @@ -1216,7 +1215,6 @@ static int hci_sock_bind(struct socket *sock, struct sockaddr *addr,
    }

    mgmt_index_removed(hdev);
    - hci_unregister_suspend_notifier(hdev);

    err = hci_dev_open(hdev->id);
    if (err) {
    @@ -1231,7 +1229,6 @@ static int hci_sock_bind(struct socket *sock, struct sockaddr *addr,
    err = 0;
    } else {
    hci_dev_clear_flag(hdev, HCI_USER_CHANNEL);
    - hci_register_suspend_notifier(hdev);
    mgmt_index_added(hdev);
    hci_dev_put(hdev);
    goto done;
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-10-19 11:03    [W:4.062 / U:0.840 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site