X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fhelper%2Flog.c;h=694e8a8b2126aa98b181f8bcd8e3c5d1051ebf47;hp=b38987232eb290b06533bf03d367c0eb07a7e6ed;hb=d74d72c73a692fbdf222c4cb595a5d015f4611c9;hpb=f955b90d28874dc238a03178503a804b3c38582a diff --git a/src/helper/log.c b/src/helper/log.c index b38987232e..694e8a8b21 100644 --- a/src/helper/log.c +++ b/src/helper/log.c @@ -269,29 +269,34 @@ char *alloc_printf(const char *fmt, va_list ap) /* no buffer at the beginning, force realloc to do the job */ char *string = NULL; - /* start with minimal length to exercise all the code paths */ - int size = 1; + /* start with buffer size suitable for typical messages */ + int size = 128; for (;;) { - size *= 2; /* double the buffer size */ + char *t = string; + string = realloc(string, size); + if (string == NULL) + { + if (t != NULL) + free(t); + return NULL; + } + + va_list ap_copy; + va_copy(ap_copy, ap); - char *t = string; - string = realloc(string, size); - if (string == NULL) - { - if (t != NULL) - free(t); - return NULL; - } - int ret; - ret = vsnprintf(string, size, fmt, ap); + ret = vsnprintf(string, size, fmt, ap_copy); + + va_end(ap_copy); + /* NB! The result of the vsnprintf() might be an *EMPTY* string! */ if ((ret >= 0) && ((ret + 1) < size)) break; /* there was just enough or not enough space, allocate more in the next round */ + size *= 2; /* double the buffer size */ } /* the returned buffer is by principle guaranteed to be at least one character longer */