From 1f2b14bb66390f8ec3cf40d95cb57d5da40b23a1 Mon Sep 17 00:00:00 2001 From: jnnrgd Date: Wed, 30 Sep 2026 10:51:00 +0200 Subject: [PATCH] mqtt: parse properties in MQTT 5.0 CONNACK packets Under MQTT 5.0, decode the property length and set props_start and props_size for MQTT_CMD_CONNACK. Add unit test coverage. --- mongoose.c | 10 ++++++++++ src/mqtt.c | 10 ++++++++++ test/unit_test.c | 7 +++++++ 3 files changed, 27 insertions(+) diff --git a/mongoose.c b/mongoose.c index 2c25a143..aa7f4291 100644 --- a/mongoose.c +++ b/mongoose.c @@ -7779,6 +7779,16 @@ int mg_mqtt_parse(const uint8_t *buf, size_t len, uint8_t version, case MQTT_CMD_CONNACK: if (end - p < 2) return MQTT_MALFORMED; m->ack = p[1]; + p += 2; + if (version == 5) { + if (p >= end) return MQTT_MALFORMED; + len_len = (uint32_t) decode_varint(p, (size_t) (end - p), &tmp); + if (!len_len) return MQTT_MALFORMED; + m->props_size = (size_t) tmp; + m->props_start = (size_t) (p + len_len - buf); + p += len_len + m->props_size; + if (p > end) return MQTT_MALFORMED; + } break; case MQTT_CMD_PUBACK: case MQTT_CMD_PUBREC: diff --git a/src/mqtt.c b/src/mqtt.c index 54ae5f40..8f85040e 100644 --- a/src/mqtt.c +++ b/src/mqtt.c @@ -438,6 +438,16 @@ int mg_mqtt_parse(const uint8_t *buf, size_t len, uint8_t version, case MQTT_CMD_CONNACK: if (end - p < 2) return MQTT_MALFORMED; m->ack = p[1]; + p += 2; + if (version == 5) { + if (p >= end) return MQTT_MALFORMED; + len_len = (uint32_t) decode_varint(p, (size_t) (end - p), &tmp); + if (!len_len) return MQTT_MALFORMED; + m->props_size = (size_t) tmp; + m->props_start = (size_t) (p + len_len - buf); + p += len_len + m->props_size; + if (p > end) return MQTT_MALFORMED; + } break; case MQTT_CMD_PUBACK: case MQTT_CMD_PUBREC: diff --git a/test/unit_test.c b/test/unit_test.c index b5de3da6..f4b44e78 100644 --- a/test/unit_test.c +++ b/test/unit_test.c @@ -803,11 +803,18 @@ static void test_mqtt_parse(void) { struct mg_mqtt_prop prop; // MQTT5 PUBLISH with Subscription Identifier = 5 const uint8_t sub_id_pkt[] = {0x30, 0x06, 0x00, 0x01, 'x', 0x02, 0x0B, 0x05}; + // MQTT5 CONNACK with Server Keep Alive = 60 + const uint8_t connack_pkt[] = {0x20, 0x06, 0x00, 0x00, 0x03, 0x13, 0x00, 0x3C}; memset(&mm, 0, sizeof(struct mg_mqtt_message)); memset(&prop, 0, sizeof(struct mg_mqtt_prop)); ASSERT(mg_mqtt_parse(sub_id_pkt, sizeof(sub_id_pkt), 5, &mm) == MQTT_OK); mg_mqtt_next_prop(&mm, &prop, 0); + + ASSERT(mg_mqtt_parse(connack_pkt, sizeof(connack_pkt), 5, &mm) == MQTT_OK); + ASSERT(mm.ack == 0); + ASSERT(mg_mqtt_next_prop(&mm, &prop, 0) > 0); + ASSERT(prop.id == MQTT_PROP_SERVER_KEEP_ALIVE && prop.iv == 60); } static void test_mqtt(void) {