summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'libutils/String8.cpp')
-rw-r--r--libutils/String8.cpp13
1 files changed, 11 insertions, 2 deletions
diff --git a/libutils/String8.cpp b/libutils/String8.cpp
index e852d77b7..8acb4d45f 100644
--- a/libutils/String8.cpp
+++ b/libutils/String8.cpp
@@ -323,8 +323,17 @@ status_t String8::appendFormat(const char* fmt, ...)
323 323
324status_t String8::appendFormatV(const char* fmt, va_list args) 324status_t String8::appendFormatV(const char* fmt, va_list args)
325{ 325{
326 int result = NO_ERROR; 326 int n, result = NO_ERROR;
327 int n = vsnprintf(NULL, 0, fmt, args); 327 va_list tmp_args;
328
329 /* args is undefined after vsnprintf.
330 * So we need a copy here to avoid the
331 * second vsnprintf access undefined args.
332 */
333 va_copy(tmp_args, args);
334 n = vsnprintf(NULL, 0, fmt, tmp_args);
335 va_end(tmp_args);
336
328 if (n != 0) { 337 if (n != 0) {
329 size_t oldLength = length(); 338 size_t oldLength = length();
330 char* buf = lockBuffer(oldLength + n); 339 char* buf = lockBuffer(oldLength + n);