Commit b716d145 by Jamie Madill

Fix long error messages breaking InfoLog::append.

Using two calls to vsnprintf allows us to correctly determine maximum buffer size as well as fixing garbage characters from a missing NULL terminator. Bug report from roland@lagoa.com. BUG=angle:561 Change-Id: I4eb156342d9106d40783a3cf57c0c1d1889390e2 Reviewed-on: https://chromium-review.googlesource.com/187843Reviewed-by: 's avatarShannon Woods <shannonwoods@chromium.org> Tested-by: 's avatarJamie Madill <jmadill@chromium.org>
parent 99125692
...@@ -95,32 +95,36 @@ void InfoLog::append(const char *format, ...) ...@@ -95,32 +95,36 @@ void InfoLog::append(const char *format, ...)
return; return;
} }
char info[1024];
va_list vararg; va_list vararg;
va_start(vararg, format); va_start(vararg, format);
vsnprintf(info, sizeof(info), format, vararg); size_t infoLength = vsnprintf(NULL, 0, format, vararg);
va_end(vararg); va_end(vararg);
size_t infoLength = strlen(info); char *logPointer = NULL;
if (!mInfoLog) if (!mInfoLog)
{ {
mInfoLog = new char[infoLength + 2]; mInfoLog = new char[infoLength + 2];
strcpy(mInfoLog, info); logPointer = mInfoLog;
strcpy(mInfoLog + infoLength, "\n");
} }
else else
{ {
size_t logLength = strlen(mInfoLog); size_t currentlogLength = strlen(mInfoLog);
char *newLog = new char[logLength + infoLength + 2]; char *newLog = new char[currentlogLength + infoLength + 2];
strcpy(newLog, mInfoLog); strcpy(newLog, mInfoLog);
strcpy(newLog + logLength, info);
strcpy(newLog + logLength + infoLength, "\n");
delete[] mInfoLog; delete[] mInfoLog;
mInfoLog = newLog; mInfoLog = newLog;
logPointer = mInfoLog + currentlogLength;
} }
va_start(vararg, format);
vsnprintf(logPointer, infoLength, format, vararg);
va_end(vararg);
logPointer[infoLength] = 0;
strcpy(logPointer + infoLength, "\n");
} }
void InfoLog::reset() void InfoLog::reset()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment