diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-12-10 00:30:38 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-12-10 00:30:38 +0000 |
commit | 6c8d29f7d1576a32d07cd6742087a8648a07f594 (patch) | |
tree | 8e38d933e31dc944061e0f9960f4f85c4608eadc /clang/lib/Basic/SourceManager.cpp | |
parent | 88d510da9dd6601b827a26a3c015f135953692bf (diff) | |
download | bcm5719-llvm-6c8d29f7d1576a32d07cd6742087a8648a07f594.tar.gz bcm5719-llvm-6c8d29f7d1576a32d07cd6742087a8648a07f594.zip |
Add a sanity check in SourceManager::getColumnNumber, make sure
we don't try to access beyond the buffer.
llvm-svn: 146305
Diffstat (limited to 'clang/lib/Basic/SourceManager.cpp')
-rw-r--r-- | clang/lib/Basic/SourceManager.cpp | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/clang/lib/Basic/SourceManager.cpp b/clang/lib/Basic/SourceManager.cpp index cdaff2f0082..85fe474d664 100644 --- a/clang/lib/Basic/SourceManager.cpp +++ b/clang/lib/Basic/SourceManager.cpp @@ -947,13 +947,20 @@ const char *SourceManager::getCharacterData(SourceLocation SL, unsigned SourceManager::getColumnNumber(FileID FID, unsigned FilePos, bool *Invalid) const { bool MyInvalid = false; - const char *Buf = getBuffer(FID, &MyInvalid)->getBufferStart(); + const llvm::MemoryBuffer *MemBuf = getBuffer(FID, &MyInvalid); if (Invalid) *Invalid = MyInvalid; if (MyInvalid) return 1; + const char *Buf = MemBuf->getBufferStart(); + if (Buf + FilePos >= MemBuf->getBufferEnd()) { + if (Invalid) + *Invalid = MyInvalid; + return 1; + } + unsigned LineStart = FilePos; while (LineStart && Buf[LineStart-1] != '\n' && Buf[LineStart-1] != '\r') --LineStart; |