Skip to content

Commit 8d59fba

Browse files
Ilia GavrilovVudentz
authored andcommitted
Bluetooth: MGMT: Fix OOB access in parse_adv_monitor_pattern()
In the parse_adv_monitor_pattern() function, the value of the 'length' variable is currently limited to HCI_MAX_EXT_AD_LENGTH(251). The size of the 'value' array in the mgmt_adv_pattern structure is 31. If the value of 'pattern[i].length' is set in the user space and exceeds 31, the 'patterns[i].value' array can be accessed out of bound when copied. Increasing the size of the 'value' array in the 'mgmt_adv_pattern' structure will break the userspace. Considering this, and to avoid OOB access revert the limits for 'offset' and 'length' back to the value of HCI_MAX_AD_LENGTH. Found by InfoTeCS on behalf of Linux Verification Center (linuxtesting.org) with SVACE. Fixes: db08722 ("Bluetooth: hci_core: Fix missing instances using HCI_MAX_AD_LENGTH") Cc: stable@vger.kernel.org Signed-off-by: Ilia Gavrilov <Ilia.Gavrilov@infotecs.ru> Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
1 parent 1c21cf8 commit 8d59fba

2 files changed

Lines changed: 4 additions & 4 deletions

File tree

include/net/bluetooth/mgmt.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -780,7 +780,7 @@ struct mgmt_adv_pattern {
780780
__u8 ad_type;
781781
__u8 offset;
782782
__u8 length;
783-
__u8 value[31];
783+
__u8 value[HCI_MAX_AD_LENGTH];
784784
} __packed;
785785

786786
#define MGMT_OP_ADD_ADV_PATTERNS_MONITOR 0x0052

net/bluetooth/mgmt.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5395,9 +5395,9 @@ static u8 parse_adv_monitor_pattern(struct adv_monitor *m, u8 pattern_count,
53955395
for (i = 0; i < pattern_count; i++) {
53965396
offset = patterns[i].offset;
53975397
length = patterns[i].length;
5398-
if (offset >= HCI_MAX_EXT_AD_LENGTH ||
5399-
length > HCI_MAX_EXT_AD_LENGTH ||
5400-
(offset + length) > HCI_MAX_EXT_AD_LENGTH)
5398+
if (offset >= HCI_MAX_AD_LENGTH ||
5399+
length > HCI_MAX_AD_LENGTH ||
5400+
(offset + length) > HCI_MAX_AD_LENGTH)
54015401
return MGMT_STATUS_INVALID_PARAMS;
54025402

54035403
p = kmalloc(sizeof(*p), GFP_KERNEL);

0 commit comments

Comments
 (0)