Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fff9d11b authored by Fengwei Yin's avatar Fengwei Yin
Browse files

Fix undefined args access for x86_64.



From libc manual for vsnprintf:
   The  functions  vprintf(),  vfprintf(), vsprintf(), vsnprintf()
   are equivalent to the functions printf(), fprintf(), sprintf(), snprintf(),
   respectively, except that they are called with a va_list instead of a
   variable number of arguments.  These  functions  do  not  call  the  va_end  macro.
   Because they invoke the va_arg macro, the value of ap is undefined after the call.

We need to allocate/end new va_list for each vsnprintf.

Change-Id: I66ec058033be1cb918e7b2bc84ca546800da226b
Signed-off-by: default avatarFengwei Yin <fengwei.yin@intel.com>
parent ebb46d76
Loading
Loading
Loading
Loading
+11 −2
Original line number Diff line number Diff line
@@ -323,8 +323,17 @@ status_t String8::appendFormat(const char* fmt, ...)

status_t String8::appendFormatV(const char* fmt, va_list args)
{
    int result = NO_ERROR;
    int n = vsnprintf(NULL, 0, fmt, args);
    int n, result = NO_ERROR;
    va_list tmp_args;

    /* args is undefined after vsnprintf.
     * So we need a copy here to avoid the
     * second vsnprintf access undefined args.
     */
    va_copy(tmp_args, args);
    n = vsnprintf(NULL, 0, fmt, tmp_args);
    va_end(tmp_args);

    if (n != 0) {
        size_t oldLength = length();
        char* buf = lockBuffer(oldLength + n);