diff --git a/src/datasets-string.c b/src/datasets-string.c index 5a5d389981..8574dccc11 100644 --- a/src/datasets-string.c +++ b/src/datasets-string.c @@ -49,8 +49,8 @@ int StringAsBase64(const void *s, char *out, size_t out_size) unsigned long len = SCBase64EncodeBufferSize(str->len); if (len + 2 > out_size) { - // linefeed and final zero - return 0; + // linefeed and final zero : signal we need more space + return len + 2; } if (SCBase64Encode((unsigned char *)str->ptr, str->len, (uint8_t *)out, &len) != SC_BASE64_OK) return 0; diff --git a/src/util-thash.c b/src/util-thash.c index 9a5b3273ff..a006d3cc52 100644 --- a/src/util-thash.c +++ b/src/util-thash.c @@ -401,7 +401,26 @@ int THashWalk(THashTableContext *ctx, THashFormatFunc FormatterFunc, THashOutput char output_string[1024] = ""; int size = FormatterFunc(h->data, output_string, sizeof(output_string)); if (size > 0) { - if (OutputterFunc(output_ctx, (const uint8_t *)output_string, size) < 0) { + if (size > 1024) { + // we did not provide enough space on the stack, let's allocate on the heap + char *out_alloc = SCCalloc(1, size); + if (out_alloc == NULL) { + err = true; + break; + } + size = FormatterFunc(h->data, out_alloc, size); + if (size == 0) { + err = true; + SCFree(out_alloc); + break; + } + if (OutputterFunc(output_ctx, (const uint8_t *)out_alloc, size) < 0) { + err = true; + SCFree(out_alloc); + break; + } + SCFree(out_alloc); + } else if (OutputterFunc(output_ctx, (const uint8_t *)output_string, size) < 0) { err = true; break; }