From 0de0becf0b024b6beca9c5f7e1ed8a08120d781c Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Mon, 28 Jun 2021 15:37:59 +0200 Subject: [PATCH] BUG/MINOR: mqtt: Support empty client ID in CONNECT message As specified by the MQTT specification (MQTT-3.1.3-6), the client ID may be empty. That means the length of the client ID string may be 0. However, The MQTT parser does not support empty strings. So, to fix the bug, the mqtt_read_string() function may now parse empty string. 2 bytes must be found to decode the string length, but the length may be 0 now. It is the caller responsibility to test the string emptiness if necessary. In addition, in mqtt_parse_connect(), the client ID may be empty now. This patch should partely fix the issue #1310. It must be backported to 2.4. --- reg-tests/converter/mqtt.vtc | 8 ++++---- src/mqtt.c | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/reg-tests/converter/mqtt.vtc b/reg-tests/converter/mqtt.vtc index 59818246a..ea2cbb4f8 100644 --- a/reg-tests/converter/mqtt.vtc +++ b/reg-tests/converter/mqtt.vtc @@ -9,9 +9,9 @@ server s1 { sendhex "20020000" close - # MQTT 3.1.1 CONNECT packet (id: test_sub - username: test - passwd: passwd) + # MQTT 3.1.1 CONNECT packet (id: - username: test - passwd: passwd) accept - recv 36 + recv 28 sendhex "20020000" close @@ -120,8 +120,8 @@ client c1_311_1 -connect ${h1_fe1_sock} { } -run client c1_311_2 -connect ${h1_fe1_sock} { - # Valid MQTT 3.1.1 CONNECT packet (id: test_sub - username: test - passwd: passwd) - sendhex "102200044d51545404c2003c0008746573745f7375620004746573740006706173737764" + # Valid MQTT 3.1.1 CONNECT packet (id: - username: test - passwd: passwd) + sendhex "101a00044d51545404c2003c00000004746573740006706173737764" recv 4 expect_close } -run diff --git a/src/mqtt.c b/src/mqtt.c index 8a6b6a065..662420121 100644 --- a/src/mqtt.c +++ b/src/mqtt.c @@ -291,7 +291,7 @@ static inline struct ist mqtt_read_string(struct ist parser, struct ist *str) uint16_t len = 0; /* read and compute the string length */ - if (istlen(parser) <= 2) + if (istlen(parser) < 2) goto error; parser = mqtt_read_2byte_int(parser, &len); @@ -862,7 +862,7 @@ static int mqtt_parse_connect(struct ist parser, struct mqtt_pkt *mpkt) */ /* read client identifier */ parser = mqtt_read_string(parser, &mpkt->data.connect.payload.client_identifier); - if (!isttest(parser) || !istlen(mpkt->data.connect.payload.client_identifier)) + if (!isttest(parser)) goto end; /* read Will Properties, for MQTT v5 only