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 <nbd@nbd.name>
This commit is contained in:
parent
6339204c21
commit
c1be505732
1 changed files with 4 additions and 1 deletions
5
udebug.c
5
udebug.c
|
@ -610,6 +610,7 @@ int udebug_entry_vprintf(struct udebug_buf *buf, const char *fmt, va_list ap)
|
||||||
struct udebug_ptr *ptr;
|
struct udebug_ptr *ptr;
|
||||||
uint32_t ofs;
|
uint32_t ofs;
|
||||||
uint32_t len;
|
uint32_t len;
|
||||||
|
va_list ap2;
|
||||||
char *str;
|
char *str;
|
||||||
|
|
||||||
if (!hdr)
|
if (!hdr)
|
||||||
|
@ -621,7 +622,9 @@ int udebug_entry_vprintf(struct udebug_buf *buf, const char *fmt, va_list ap)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
str = udebug_buf_alloc(buf, ofs, UDEBUG_MIN_ALLOC_LEN);
|
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)
|
if (len <= UDEBUG_MIN_ALLOC_LEN)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue