|
@@ -558,10 +558,17 @@ tor_vasprintf(char **strp, const char *fmt, va_list args)
|
|
|
int len, r;
|
|
|
va_list tmp_args;
|
|
|
va_copy(tmp_args, args);
|
|
|
- /* vsnprintf() was properly checked but tor_vsnprintf() available so
|
|
|
- * why not use it? */
|
|
|
- len = tor_vsnprintf(buf, sizeof(buf), fmt, tmp_args);
|
|
|
+ /* Use vsnprintf to retrieve needed length. tor_vsnprintf() is not an option
|
|
|
+ * here because it will simply return -1 if buf is not large enough to hold the
|
|
|
+ * complete string.
|
|
|
+ */
|
|
|
+ len = vsnprintf(buf, sizeof(buf), fmt, tmp_args);
|
|
|
va_end(tmp_args);
|
|
|
+ buf[sizeof(buf) - 1] = '\0';
|
|
|
+ if (len < 0) {
|
|
|
+ *strp = NULL;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
if (len < (int)sizeof(buf)) {
|
|
|
*strp = tor_strdup(buf);
|
|
|
return len;
|