diff options
Diffstat (limited to 'libutils/String8.cpp')
-rw-r--r-- | libutils/String8.cpp | 13 |
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 | ||
324 | status_t String8::appendFormatV(const char* fmt, va_list args) | 324 | status_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); |