From 23269e20d877d88813c757c0e5eab370f94c1972 Mon Sep 17 00:00:00 2001 From: mmadersbacher Date: Tue, 18 Aug 2026 22:24:29 +0200 Subject: [PATCH] bluetooth: parse every advertising set in Set_Extended_Advertise_Enable Extended_Advertise_Set does not override extract_padding, so the first set claims the remaining sets as its payload and PacketListField stops after one entry. A command with num_sets=2 dissected into len(sets)==1, with the second set left in sets[0].payload as Raw. HCI_LE_Meta_Extended_Advertising_Report already does this in the same module. AI-Assisted: yes (Claude Code) --- scapy/layers/bluetooth.py | 3 +++ test/scapy/layers/bluetooth.uts | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/scapy/layers/bluetooth.py b/scapy/layers/bluetooth.py index d4ef6417aff..8f6474f7d50 100644 --- a/scapy/layers/bluetooth.py +++ b/scapy/layers/bluetooth.py @@ -2272,6 +2272,9 @@ class Extended_Advertise_Set(Packet): LEShortField('duration', 0), ByteField('max_events', 0)] + def extract_padding(self, s): + return b'', s + class HCI_Cmd_LE_Set_Extended_Advertise_Enable(Packet): name = 'HCI_LE_Set_Extended_Advertising_Enable' diff --git a/test/scapy/layers/bluetooth.uts b/test/scapy/layers/bluetooth.uts index 89dbdfc22c2..e3c179b9655 100644 --- a/test/scapy/layers/bluetooth.uts +++ b/test/scapy/layers/bluetooth.uts @@ -1169,3 +1169,24 @@ assert p[HCI_Mon_Index_Info].manufacturer == 0x131 p = HCI_Mon_Pcap_Hdr(hex_bytes("ffff000c426c7565746f6f74682073756273797374656d2076657273696f6e20322e323200")) assert HCI_Mon_System_Note in p assert p[HCI_Mon_System_Note].note == b'Bluetooth subsystem version 2.22' + += HCI_Cmd_LE_Set_Extended_Advertise_Enable - multiple advertising sets + +p = HCI_Cmd_LE_Set_Extended_Advertise_Enable(hex_bytes("01020164000502c8000a")) +assert p.num_sets == 2 +assert len(p.sets) == 2 +assert p.sets[0].handle == 1 +assert p.sets[0].duration == 100 +assert p.sets[0].max_events == 5 +assert p.sets[1].handle == 2 +assert p.sets[1].duration == 200 +assert p.sets[1].max_events == 10 +assert raw(p) == hex_bytes("01020164000502c8000a") + += HCI_Cmd_LE_Set_Extended_Advertise_Enable - single advertising set + +p = HCI_Cmd_LE_Set_Extended_Advertise_Enable(hex_bytes("010101640005")) +assert p.num_sets == 1 +assert len(p.sets) == 1 +assert p.sets[0].handle == 1 +assert raw(p) == hex_bytes("010101640005")