]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
Bluetooth: hci_sync: make hci_cmd_sync_run_once return -EEXIST if exists
authorPauli Virtanen <pav@iki.fi>
Wed, 25 Mar 2026 19:07:45 +0000 (21:07 +0200)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Mon, 13 Apr 2026 13:18:16 +0000 (09:18 -0400)
hci_cmd_sync_run_once() needs to indicate whether a queue item was
added, so caller can know if callbacks are called, so it can avoid
leaking resources.

Change the function to return -EEXIST if queue item already exists.

Modify all callsites vs. the changes.  The only callsite is
hci_abort_conn().

Signed-off-by: Pauli Virtanen <pav@iki.fi>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
net/bluetooth/hci_conn.c
net/bluetooth/hci_sync.c

index 11d3ad8d25514598940fd71bc7ebef67c0cb95f5..3a0592599086151328e02fe34a15db303154ed74 100644 (file)
@@ -3083,6 +3083,7 @@ static int abort_conn_sync(struct hci_dev *hdev, void *data)
 int hci_abort_conn(struct hci_conn *conn, u8 reason)
 {
        struct hci_dev *hdev = conn->hdev;
+       int err;
 
        /* If abort_reason has already been set it means the connection is
         * already being aborted so don't attempt to overwrite it.
@@ -3119,7 +3120,8 @@ int hci_abort_conn(struct hci_conn *conn, u8 reason)
         * as a result to MGMT_OP_DISCONNECT/MGMT_OP_UNPAIR which does
         * already queue its callback on cmd_sync_work.
         */
-       return hci_cmd_sync_run_once(hdev, abort_conn_sync, conn, NULL);
+       err = hci_cmd_sync_run_once(hdev, abort_conn_sync, conn, NULL);
+       return (err == -EEXIST) ? 0 : err;
 }
 
 void hci_setup_tx_timestamp(struct sk_buff *skb, size_t key_offset,
index 919ec275dd237d301b13734d2c2b5d8486df933b..fd3aacdea512a37c22b9a2be90c89ddca4b4d99f 100644 (file)
@@ -825,7 +825,7 @@ int hci_cmd_sync_run_once(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
                          void *data, hci_cmd_sync_work_destroy_t destroy)
 {
        if (hci_cmd_sync_lookup_entry(hdev, func, data, destroy))
-               return 0;
+               return -EEXIST;
 
        return hci_cmd_sync_run(hdev, func, data, destroy);
 }