Ensure to pack string length in 'z' template

Ensure to pack string length in 'z' template to skipstone_message_pack()
This commit is contained in:
XANTRONIX Development 2020-09-21 22:46:42 -05:00
parent 31b227fcea
commit bd20b8da36
3 changed files with 13 additions and 3 deletions

View file

@ -13,11 +13,13 @@ int main(int argc, char **argv) {
if ((len = skipstone_message_pack(buf, if ((len = skipstone_message_pack(buf,
SKIPSTONE_MESSAGE_MAX_PAYLOAD, SKIPSTONE_MESSAGE_MAX_PAYLOAD,
"CCCC", "CCCCzz",
1, 1,
2, 2,
3, 3,
4)) < 0) { 4,
"KMFDM",
"Nihil")) < 0) {
fprintf(stderr, "%s: %s: %s\n", argv[0], fprintf(stderr, "%s: %s: %s\n", argv[0],
"skipstone_message_pack()", strerror(errno)); "skipstone_message_pack()", strerror(errno));

View file

@ -8,6 +8,7 @@
#include <skipstone/map.h> #include <skipstone/map.h>
#define SKIPSTONE_MESSAGE_MAX_PAYLOAD 4096 #define SKIPSTONE_MESSAGE_MAX_PAYLOAD 4096
#define SKIPSTONE_MESSAGE_MAX_STRLEN 256
ssize_t skipstone_message_pack(void *message, ssize_t skipstone_message_pack(void *message,
size_t len, size_t len,

View file

@ -60,10 +60,16 @@ ssize_t skipstone_message_pack(void *message,
char *value = va_arg(args, char *); char *value = va_arg(args, char *);
size_t sz = strlen(value); size_t sz = strlen(value);
if (len < offset + sz) { if (len < offset + sz + 1) {
goto done; goto done;
} else if (sz > SKIPSTONE_MESSAGE_MAX_STRLEN) {
errno = EOVERFLOW;
goto error_toobig;
} }
((uint8_t *)message)[offset++] = (uint8_t)sz;
memcpy((uint8_t *)message + offset, value, sz); memcpy((uint8_t *)message + offset, value, sz);
offset += sz; offset += sz;
@ -83,6 +89,7 @@ ssize_t skipstone_message_pack(void *message,
done: done:
return offset; return offset;
error_toobig:
error_invalid_template: error_invalid_template:
return -1; return -1;
} }