summaryrefslogtreecommitdiff
path: root/sysdep/unix
diff options
context:
space:
mode:
authorMaria Matejka <mq@ucw.cz>2019-07-10 11:12:41 +0200
committerMaria Matejka <mq@ucw.cz>2019-07-10 11:12:41 +0200
commit422a9334294dd9a5b13abd8563a3dc7233e64b13 (patch)
tree0f537f340958d1ddf59410f856ddd9c30ce76466 /sysdep/unix
parentdeb84d79896cca3ac10ff9f853604f845c9420a7 (diff)
Debug: growing message format buffer
This led in corner cases to undefined buffer content and garbage output.
Diffstat (limited to 'sysdep/unix')
-rw-r--r--sysdep/unix/log.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/sysdep/unix/log.c b/sysdep/unix/log.c
index c9064834..9d107709 100644
--- a/sysdep/unix/log.c
+++ b/sysdep/unix/log.c
@@ -309,14 +309,23 @@ die(const char *msg, ...)
void
debug(const char *msg, ...)
{
+#define MAX_DEBUG_BUFSIZE 65536
va_list args;
- char buf[1024];
+ static uint bufsize = 4096;
+ static char *buf = NULL;
+
+ if (!buf)
+ buf = mb_alloc(&root_pool, bufsize);
va_start(args, msg);
if (dbgf)
{
- if (bvsnprintf(buf, sizeof(buf), msg, args) < 0)
- bsprintf(buf + sizeof(buf) - 100, " ... <too long>\n");
+ while (bvsnprintf(buf, bufsize, msg, args) < 0)
+ if (bufsize >= MAX_DEBUG_BUFSIZE)
+ bug("Extremely long debug output, split it.");
+ else
+ buf = mb_realloc(buf, (bufsize *= 2));
+
fputs(buf, dbgf);
}
va_end(args);