mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-12 17:32:19 +00:00
In MemoryBuffer::getOpenFile() make sure that the buffer is null-terminated if
the caller requested a null-terminated one. When mapping the file there could be a racing issue that resulted in the file being larger than the FileSize passed by the caller. We already have an assertion for this in MemoryBuffer::init() but have a runtime guarantee that the buffer will be null-terminated, so do a copy that adds a null-terminator. Protects against crash of rdar://11161822. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@154082 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b657a90929
commit
541b2a4aa3
@ -304,6 +304,16 @@ error_code MemoryBuffer::getOpenFile(int FD, const char *Filename,
|
||||
RealMapOffset)) {
|
||||
result.reset(GetNamedBuffer<MemoryBufferMMapFile>(
|
||||
StringRef(Pages + Delta, MapSize), Filename, RequiresNullTerminator));
|
||||
|
||||
if (RequiresNullTerminator && result->getBufferEnd()[0] != '\0') {
|
||||
// There could be a racing issue that resulted in the file being larger
|
||||
// than the FileSize passed by the caller. We already have an assertion
|
||||
// for this in MemoryBuffer::init() but have a runtime guarantee that
|
||||
// the buffer will be null-terminated here, so do a copy that adds a
|
||||
// null-terminator.
|
||||
result.reset(MemoryBuffer::getMemBufferCopy(result->getBuffer(),
|
||||
Filename));
|
||||
}
|
||||
return error_code::success();
|
||||
}
|
||||
}
|
||||
@ -339,6 +349,7 @@ error_code MemoryBuffer::getOpenFile(int FD, const char *Filename,
|
||||
if (NumRead == 0) {
|
||||
assert(0 && "We got inaccurate FileSize value or fstat reported an "
|
||||
"invalid file size.");
|
||||
*BufPtr = '\0'; // null-terminate at the actual size.
|
||||
break;
|
||||
}
|
||||
BytesLeft -= NumRead;
|
||||
|
Loading…
x
Reference in New Issue
Block a user