mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-10-21 14:47:31 +09:00
Avoid potentially unsafe snprintf usage in FPSCounter.
snprintf returns the number of bytes it would have written when it runs out of space. This patch makes sure we properly handle this unlikely event in FPSCounter. This patch also makes sure we don't print out the contents of an uninitialized buffer.
This commit is contained in:
parent
567399f367
commit
c585066b4c
1 changed files with 21 additions and 6 deletions
|
|
@ -210,7 +210,10 @@ FPSCounter::WriteFrameTimeStamps(PRFileDesc* fd)
|
||||||
const int bufferSize = 256;
|
const int bufferSize = 256;
|
||||||
char buffer[bufferSize];
|
char buffer[bufferSize];
|
||||||
int writtenCount = SprintfLiteral(buffer, "FPS Data for: %s\n", mFPSName);
|
int writtenCount = SprintfLiteral(buffer, "FPS Data for: %s\n", mFPSName);
|
||||||
MOZ_ASSERT(writtenCount >= 0);
|
MOZ_ASSERT(writtenCount < bufferSize);
|
||||||
|
if (writtenCount >= bufferSize) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
PR_Write(fd, buffer, writtenCount);
|
PR_Write(fd, buffer, writtenCount);
|
||||||
|
|
||||||
ResetReverseIterator();
|
ResetReverseIterator();
|
||||||
|
|
@ -225,8 +228,10 @@ FPSCounter::WriteFrameTimeStamps(PRFileDesc* fd)
|
||||||
while (HasNext(startTimeStamp)) {
|
while (HasNext(startTimeStamp)) {
|
||||||
TimeDuration duration = previousSample - nextTimeStamp;
|
TimeDuration duration = previousSample - nextTimeStamp;
|
||||||
writtenCount = SprintfLiteral(buffer, "%f,\n", duration.ToMilliseconds());
|
writtenCount = SprintfLiteral(buffer, "%f,\n", duration.ToMilliseconds());
|
||||||
|
MOZ_ASSERT(writtenCount < bufferSize);
|
||||||
MOZ_ASSERT(writtenCount >= 0);
|
if (writtenCount >= bufferSize) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
PR_Write(fd, buffer, writtenCount);
|
PR_Write(fd, buffer, writtenCount);
|
||||||
|
|
||||||
previousSample = nextTimeStamp;
|
previousSample = nextTimeStamp;
|
||||||
|
|
@ -299,8 +304,13 @@ FPSCounter::PrintFPS()
|
||||||
void
|
void
|
||||||
FPSCounter::PrintHistogram(std::map<int, int>& aHistogram)
|
FPSCounter::PrintHistogram(std::map<int, int>& aHistogram)
|
||||||
{
|
{
|
||||||
|
if (aHistogram.size() == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
int length = 0;
|
int length = 0;
|
||||||
const int kBufferLength = 512;
|
const int kBufferLength = 512;
|
||||||
|
int availableSpace = kBufferLength;
|
||||||
char buffer[kBufferLength];
|
char buffer[kBufferLength];
|
||||||
|
|
||||||
for (std::map<int, int>::iterator iter = aHistogram.begin();
|
for (std::map<int, int>::iterator iter = aHistogram.begin();
|
||||||
|
|
@ -309,9 +319,14 @@ FPSCounter::PrintHistogram(std::map<int, int>& aHistogram)
|
||||||
int fps = iter->first;
|
int fps = iter->first;
|
||||||
int count = iter->second;
|
int count = iter->second;
|
||||||
|
|
||||||
length += snprintf(buffer + length, kBufferLength - length,
|
int lengthRequired = snprintf(buffer + length, availableSpace,
|
||||||
"FPS: %d = %d. ", fps, count);
|
"FPS: %d = %d. ", fps, count);
|
||||||
NS_ASSERTION(length >= kBufferLength, "Buffer overrun while printing FPS histogram.");
|
// Ran out of buffer space. Oh well - just print what we have.
|
||||||
|
if (lengthRequired > availableSpace) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
length += lengthRequired;
|
||||||
|
availableSpace -= lengthRequired;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf_stderr("%s\n", buffer);
|
printf_stderr("%s\n", buffer);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue