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/186988
Reviewed-by: Nicolas Capens <nicolascapens@chromium.org>
Reviewed-by: Shannon Woods <shannonwoods@chromium.org>
Tested-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libGLESv2/Program.cpp b/src/libGLESv2/Program.cpp
index a59a0f9..c9da1a3 100644
--- a/src/libGLESv2/Program.cpp
+++ b/src/libGLESv2/Program.cpp
@@ -95,32 +95,36 @@
return;
}
- char info[1024];
-
va_list vararg;
va_start(vararg, format);
- vsnprintf(info, sizeof(info), format, vararg);
+ size_t infoLength = vsnprintf(NULL, 0, format, vararg);
va_end(vararg);
- size_t infoLength = strlen(info);
+ char *logPointer = NULL;
if (!mInfoLog)
{
mInfoLog = new char[infoLength + 2];
- strcpy(mInfoLog, info);
- strcpy(mInfoLog + infoLength, "\n");
+ logPointer = mInfoLog;
}
else
{
- size_t logLength = strlen(mInfoLog);
- char *newLog = new char[logLength + infoLength + 2];
+ size_t currentlogLength = strlen(mInfoLog);
+ char *newLog = new char[currentlogLength + infoLength + 2];
strcpy(newLog, mInfoLog);
- strcpy(newLog + logLength, info);
- strcpy(newLog + logLength + infoLength, "\n");
delete[] mInfoLog;
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()