]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
Bluetooth: MGMT: Fix memory leak in set_ssp_complete
authorJianpeng Chang <jianpeng.chang.cn@windriver.com>
Wed, 21 Jan 2026 05:29:26 +0000 (13:29 +0800)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Thu, 22 Jan 2026 18:26:53 +0000 (13:26 -0500)
Fix memory leak in set_ssp_complete() where mgmt_pending_cmd structures
are not freed after being removed from the pending list.

Commit 302a1f674c00 ("Bluetooth: MGMT: Fix possible UAFs") replaced
mgmt_pending_foreach() calls with individual command handling but missed
adding mgmt_pending_free() calls in both error and success paths of
set_ssp_complete(). Other completion functions like set_le_complete()
were fixed correctly in the same commit.

This causes a memory leak of the mgmt_pending_cmd structure and its
associated parameter data for each SSP command that completes.

Add the missing mgmt_pending_free(cmd) calls in both code paths to fix
the memory leak. Also fix the same issue in set_advertising_complete().

Fixes: 302a1f674c00 ("Bluetooth: MGMT: Fix possible UAFs")
Signed-off-by: Jianpeng Chang <jianpeng.chang.cn@windriver.com>
Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
net/bluetooth/mgmt.c

index 5be9b8c919490d2c58dbd26c9460452ce9c16f75..0e46f9e08b1067a3c7983913107ffcacba6a50f9 100644 (file)
@@ -1966,6 +1966,7 @@ static void set_ssp_complete(struct hci_dev *hdev, void *data, int err)
                }
 
                mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_err);
+               mgmt_pending_free(cmd);
                return;
        }
 
@@ -1984,6 +1985,7 @@ static void set_ssp_complete(struct hci_dev *hdev, void *data, int err)
                sock_put(match.sk);
 
        hci_update_eir_sync(hdev);
+       mgmt_pending_free(cmd);
 }
 
 static int set_ssp_sync(struct hci_dev *hdev, void *data)
@@ -6438,6 +6440,7 @@ static void set_advertising_complete(struct hci_dev *hdev, void *data, int err)
                hci_dev_clear_flag(hdev, HCI_ADVERTISING);
 
        settings_rsp(cmd, &match);
+       mgmt_pending_free(cmd);
 
        new_settings(hdev, match.sk);