llvm-cov: Slightly improved error checking.
authorYuchen Wu <yuchenericwu@hotmail.com>
Thu, 14 Nov 2013 00:38:41 +0000 (00:38 +0000)
committerYuchen Wu <yuchenericwu@hotmail.com>
Thu, 14 Nov 2013 00:38:41 +0000 (00:38 +0000)
- readInt() should check all 4 bytes can be read, not just 1.
- In the event of false data in the gcno file, it was possible to index
  into a non-existent index of SmallVector, causing assertion error.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194639 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/GCOV.h
lib/IR/GCOV.cpp

index 469a9e3ef94eb2508d4e8c5eb13ea2279178fc0c..0aa716aac0772d4d0cca7430d1f113ec77a1042e 100644 (file)
@@ -152,11 +152,11 @@ public:
   }
 
   bool readInt(uint32_t &Val) {
-    StringRef Str = Buffer->getBuffer().slice(Cursor, Cursor+4);
-    if (Str.empty()) {
+    if (Buffer->getBuffer().size() < Cursor+4) {
       errs() << "Unexpected end of memory buffer: " << Cursor+4 << ".\n";
       return false;
     }
+    StringRef Str = Buffer->getBuffer().slice(Cursor, Cursor+4);
     Cursor += 4;
     Val = *(const uint32_t *)(Str.data());
     return true;
index 65ed3a5a84bf47da5820dfd22a4bdb86454cec26..a91e88c4e0f8bf1b5a892ec686ed26ea3335bc2c 100644 (file)
@@ -135,6 +135,10 @@ bool GCOVFunction::read(GCOVBuffer &Buff, GCOV::GCOVFormat Format) {
     // This for loop adds the counts for each block. A second nested loop is
     // required to combine the edge counts that are contained in the GCDA file.
     for (uint32_t Line = 0; Count > 0; ++Line) {
+      if (Line >= Blocks.size()) {
+        errs() << "Unexpected number of edges.\n";
+        return false;
+      }
       GCOVBlock &Block = *Blocks[Line];
       for (size_t Edge = 0, End = Block.getNumEdges(); Edge < End; ++Edge) {
         if (Count == 0) {