diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2012-04-05 04:23:56 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2012-04-05 04:23:56 +0000 |
commit | ef909265e8a4fb32405fe8fe5eb1b29c3d2bae1c (patch) | |
tree | ba4637b2d053cb541a30dfbc995ce678cffe232f /llvm/lib/Support | |
parent | 504957f413bcdfc3fea97cf98dcf6145736610f9 (diff) | |
download | bcm5719-llvm-ef909265e8a4fb32405fe8fe5eb1b29c3d2bae1c.tar.gz bcm5719-llvm-ef909265e8a4fb32405fe8fe5eb1b29c3d2bae1c.zip |
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.
llvm-svn: 154082
Diffstat (limited to 'llvm/lib/Support')
-rw-r--r-- | llvm/lib/Support/MemoryBuffer.cpp | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/llvm/lib/Support/MemoryBuffer.cpp b/llvm/lib/Support/MemoryBuffer.cpp index 911a03f8088..16e5c7a9f72 100644 --- a/llvm/lib/Support/MemoryBuffer.cpp +++ b/llvm/lib/Support/MemoryBuffer.cpp @@ -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; |