From c1be505732e6d254464973bdeacb955214c76c46 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Fri, 26 Jan 2024 21:00:14 +0100 Subject: [PATCH] udebug: fix crash in udebug_entry_vprintf with longer strings The passed va_list ap cannot be used more than once. In order to deal with vsprintf retry, it needs to be copied first. Fixes a procd crash observed on several platforms. Signed-off-by: Felix Fietkau --- udebug.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/udebug.c b/udebug.c index 31b0210..e39a32c 100644 --- a/udebug.c +++ b/udebug.c @@ -610,6 +610,7 @@ int udebug_entry_vprintf(struct udebug_buf *buf, const char *fmt, va_list ap) struct udebug_ptr *ptr; uint32_t ofs; uint32_t len; + va_list ap2; char *str; if (!hdr) @@ -621,7 +622,9 @@ int udebug_entry_vprintf(struct udebug_buf *buf, const char *fmt, va_list ap) return -1; str = udebug_buf_alloc(buf, ofs, UDEBUG_MIN_ALLOC_LEN); - len = vsnprintf(str, UDEBUG_MIN_ALLOC_LEN, fmt, ap); + va_copy(ap2, ap); + len = vsnprintf(str, UDEBUG_MIN_ALLOC_LEN, fmt, ap2); + va_end(ap2); if (len <= UDEBUG_MIN_ALLOC_LEN) goto out; -- 2.30.2