commit fa69f2a49c397c0a843157804d3b76b3fc0c93e2
parent 0542d70a71c08a741319ac7c36b9cdf53ffeade2
Author: Joris Vink <joris@coders.se>
Date:   Fri, 22 Aug 2014 14:40:19 +0200
Attempt vsnprintf() up to BUFSIZ in kore_buf_appendv().
If the result was too large fall back to vasprintf instead.
Diffstat:
1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/src/buf.c b/src/buf.c
@@ -56,14 +56,23 @@ void
 kore_buf_appendv(struct kore_buf *buf, const char *fmt, va_list args)
 {
 	int		l;
-	char		*b;
+	char		*b, sb[BUFSIZ];
 
-	l = vasprintf(&b, fmt, args);
+	l = vsnprintf(sb, sizeof(sb), fmt, args);
 	if (l == -1)
-		fatal("kore_buf_appendv(): error or truncation");
+		fatal("kore_buf_appendv(): vsnprintf error");
+
+	if ((size_t)l >= sizeof(sb)) {
+		l = vasprintf(&b, fmt, args);
+		if (l == -1)
+			fatal("kore_buf_appendv(): error or truncation");
+	} else {
+		b = sb;
+	}
 
 	kore_buf_append(buf, (u_int8_t *)b, l);
-	free(b);
+	if (b != sb)
+		free(b);
 }
 
 void