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.
This commit is contained in:
Christopher Faulet 2021-06-28 15:37:59 +02:00
parent ca925c9c28
commit 0de0becf0b
2 changed files with 6 additions and 6 deletions

View File

@ -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: <empty> - 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: <empty> - username: test - passwd: passwd)
sendhex "101a00044d51545404c2003c00000004746573740006706173737764"
recv 4
expect_close
} -run

View File

@ -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