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