From 2da850912007dd0c2a27285e6162c2abfa8c8702 Mon Sep 17 00:00:00 2001 From: SeaStar Deng <37767638+DSeaStar@users.noreply.github.com> Date: Fri, 14 Aug 2026 18:34:35 +0000 Subject: [PATCH] MQTT: do not crash when MQTTPublish has no underlayer MQTTPublish.msgid and MQTTPublish.value read QOS/len from the underlayer without a None check, so MQTTPublish().show() raised AttributeError. Guard both callbacks so a standalone publish packet can be displayed. Fixes #5071 AI-Assisted: yes (Claude) Signed-off-by: SeaStar Deng <172368758@qq.com> --- scapy/contrib/mqtt.py | 11 ++++++----- test/contrib/mqtt.uts | 7 +++++++ 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/scapy/contrib/mqtt.py b/scapy/contrib/mqtt.py index a2518ab0d90..09586ee883e 100644 --- a/scapy/contrib/mqtt.py +++ b/scapy/contrib/mqtt.py @@ -198,12 +198,13 @@ class MQTTPublish(Packet): StrLenField("topic", "", length_from=lambda pkt: pkt.length), ConditionalField(ShortField("msgid", None), - lambda pkt: (pkt.underlayer.QOS == 1 or - pkt.underlayer.QOS == 2)), + lambda pkt: pkt.underlayer is not None and + pkt.underlayer.QOS in (1, 2)), StrLenField("value", "", - length_from=lambda pkt: pkt.underlayer.len - pkt.length - 2 - if pkt.underlayer.QOS == 0 else - pkt.underlayer.len - pkt.length - 4) + length_from=lambda pkt: 0 if pkt.underlayer is None else + (pkt.underlayer.len - pkt.length - 2 + if pkt.underlayer.QOS == 0 else + pkt.underlayer.len - pkt.length - 4)) ] diff --git a/test/contrib/mqtt.uts b/test/contrib/mqtt.uts index ad444a05104..9de2d0da549 100644 --- a/test/contrib/mqtt.uts +++ b/test/contrib/mqtt.uts @@ -187,3 +187,10 @@ assert MQTTUnsubscribe in u and len(u.topics) == 2 and u.topics[1].topic == b"c/ = MQTTSubscribe u = MQTT(b'\x82\x10\x00\x01\x00\x03\x61\x2F\x62\x02\x00\x03\x63\x2F\x64\x00') assert MQTTSubscribe in u and len(u.topics) == 2 and u.topics[1].topic == b"c/d" + += MQTTPublish without underlayer does not crash +p = MQTTPublish() +p.show() +assert p.topic == b"" +assert p.value == b"" +assert p.msgid is None