summaryrefslogtreecommitdiff
path: root/tests/server
diff options
context:
space:
mode:
authorHarry Sintonen <sintonen@iki.fi>2021-06-01 18:22:31 +0300
committerDaniel Stenberg <daniel@haxx.se>2021-06-02 13:34:17 +0200
commit8ccf75532bb801346a8ccd8013ad631aac34092b (patch)
treec771bebce500fe8a6caed36504c328457f8b7bb4 /tests/server
parent4f209d883382517206bc5f93603c512c1d9c4e54 (diff)
downloadcurl-8ccf75532bb801346a8ccd8013ad631aac34092b.tar.gz
mqtt: detect illegal and too large file size
Add test 3017 and 3018 to verify. Closes #7166
Diffstat (limited to 'tests/server')
-rw-r--r--tests/server/mqttd.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/tests/server/mqttd.c b/tests/server/mqttd.c
index 8134336da..18339262e 100644
--- a/tests/server/mqttd.c
+++ b/tests/server/mqttd.c
@@ -106,6 +106,7 @@ struct configurable {
this */
bool publish_before_suback;
bool short_publish;
+ bool excessive_remaining;
unsigned char error_connack;
int testnum;
};
@@ -130,6 +131,7 @@ static void resetdefaults(void)
config.version = CONFIG_VERSION;
config.publish_before_suback = FALSE;
config.short_publish = FALSE;
+ config.excessive_remaining = FALSE;
config.error_connack = 0;
config.testnum = 0;
}
@@ -171,6 +173,10 @@ static void getconfig(void)
config.testnum = atoi(value);
logmsg("testnum = %d", config.testnum);
}
+ else if(!strcmp(key, "excessive-remaining")) {
+ logmsg("excessive-remaining set");
+ config.excessive_remaining = TRUE;
+ }
}
}
fclose(fp);
@@ -337,7 +343,8 @@ static int disconnect(FILE *dump, curl_socket_t fd)
*/
/* return number of bytes used */
-static int encode_length(size_t packetlen, char *remlength) /* 4 bytes */
+static int encode_length(size_t packetlen,
+ unsigned char *remlength) /* 4 bytes */
{
int bytes = 0;
unsigned char encode;
@@ -393,10 +400,19 @@ static int publish(FILE *dump,
ssize_t packetlen;
ssize_t sendamount;
ssize_t rc;
- char rembuffer[4];
+ unsigned char rembuffer[4];
int encodedlen;
- encodedlen = encode_length(remaininglength, rembuffer);
+ if(config.excessive_remaining) {
+ /* manually set illegal remaining length */
+ rembuffer[0] = 0xff;
+ rembuffer[1] = 0xff;
+ rembuffer[2] = 0xff;
+ rembuffer[3] = 0x80; /* maximum allowed here by spec is 0x7f */
+ encodedlen = 4;
+ }
+ else
+ encodedlen = encode_length(remaininglength, rembuffer);
/* one packet type byte (possibly two more for packetid) */
packetlen = remaininglength + encodedlen + 1;