InstrProf: Actually detect bad headers
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>
Fri, 21 Mar 2014 20:42:28 +0000 (20:42 +0000)
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>
Fri, 21 Mar 2014 20:42:28 +0000 (20:42 +0000)
<rdar://problem/15950346>

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

include/llvm/ProfileData/InstrProf.h
lib/ProfileData/InstrProf.cpp
lib/ProfileData/InstrProfReader.cpp
test/tools/llvm-profdata/raw-magic-but-no-header.test [new file with mode: 0644]

index e2291ef2a9b3fe8275677612a3d52a08a45f0691..d8f3ca6b9d85cd3f89f09e31fe76fa86d34f2f3e 100644 (file)
@@ -27,6 +27,7 @@ struct instrprof_error {
     success = 0,
     eof,
     bad_magic,
     success = 0,
     eof,
     bad_magic,
+    bad_header,
     unsupported_version,
     too_large,
     truncated,
     unsupported_version,
     too_large,
     truncated,
index ecabdd75bdf73556347101e51f08f0191a2acb15..850f61354e33dc875ab571ec7081c81af30d7ee4 100644 (file)
@@ -29,6 +29,8 @@ class InstrProfErrorCategoryType : public error_category {
       return "End of File";
     case instrprof_error::bad_magic:
       return "Invalid file format (bad magic)";
       return "End of File";
     case instrprof_error::bad_magic:
       return "Invalid file format (bad magic)";
+    case instrprof_error::bad_header:
+      return "Invalid header";
     case instrprof_error::unsupported_version:
       return "Unsupported format version";
     case instrprof_error::too_large:
     case instrprof_error::unsupported_version:
       return "Unsupported format version";
     case instrprof_error::too_large:
index c563355599f103814c16e4530f5173df9186cdc6..d2e5fbd9b9a132c33d4e76f3b2a40965cefb608e 100644 (file)
@@ -43,8 +43,7 @@ error_code InstrProfReader::create(std::string Path,
 
   if (Buffer->getBufferSize() < sizeof(uint64_t)) {
     Result.reset(new TextInstrProfReader(Buffer));
 
   if (Buffer->getBufferSize() < sizeof(uint64_t)) {
     Result.reset(new TextInstrProfReader(Buffer));
-    Result->readHeader();
-    return instrprof_error::success;
+    return Result->readHeader();
   }
 
   uint64_t Magic = *(uint64_t *)Buffer->getBufferStart();
   }
 
   uint64_t Magic = *(uint64_t *)Buffer->getBufferStart();
@@ -53,8 +52,7 @@ error_code InstrProfReader::create(std::string Path,
     Result.reset(new RawInstrProfReader(Buffer));
   else
     Result.reset(new TextInstrProfReader(Buffer));
     Result.reset(new RawInstrProfReader(Buffer));
   else
     Result.reset(new TextInstrProfReader(Buffer));
-  Result->readHeader();
-  return instrprof_error::success;
+  return Result->readHeader();
 }
 
 void InstrProfIterator::Increment() {
 }
 
 void InstrProfIterator::Increment() {
@@ -113,13 +111,13 @@ RawInstrProfReader::RawInstrProfReader(std::unique_ptr<MemoryBuffer> &DataBuffer
 
 error_code RawInstrProfReader::readHeader() {
   if (DataBuffer->getBufferSize() < sizeof(RawHeader))
 
 error_code RawInstrProfReader::readHeader() {
   if (DataBuffer->getBufferSize() < sizeof(RawHeader))
-    return error(instrprof_error::malformed);
+    return error(instrprof_error::bad_header);
   const RawHeader *Header = (RawHeader *)DataBuffer->getBufferStart();
   if (Header->Magic == getRawMagic())
     ShouldSwapBytes = false;
   else {
     if (sys::SwapByteOrder(Header->Magic) != getRawMagic())
   const RawHeader *Header = (RawHeader *)DataBuffer->getBufferStart();
   if (Header->Magic == getRawMagic())
     ShouldSwapBytes = false;
   else {
     if (sys::SwapByteOrder(Header->Magic) != getRawMagic())
-      return error(instrprof_error::malformed);
+      return error(instrprof_error::bad_magic);
 
     ShouldSwapBytes = true;
   }
 
     ShouldSwapBytes = true;
   }
@@ -142,7 +140,7 @@ error_code RawInstrProfReader::readHeader(const RawHeader &Header) {
   size_t FileSize = NamesOffset + sizeof(char) * NamesSize;
 
   if (FileSize != DataBuffer->getBufferSize())
   size_t FileSize = NamesOffset + sizeof(char) * NamesSize;
 
   if (FileSize != DataBuffer->getBufferSize())
-    return error(instrprof_error::malformed);
+    return error(instrprof_error::bad_header);
 
   Data = (ProfileData *)(DataBuffer->getBufferStart() + DataOffset);
   DataEnd = Data + DataSize;
 
   Data = (ProfileData *)(DataBuffer->getBufferStart() + DataOffset);
   DataEnd = Data + DataSize;
diff --git a/test/tools/llvm-profdata/raw-magic-but-no-header.test b/test/tools/llvm-profdata/raw-magic-but-no-header.test
new file mode 100644 (file)
index 0000000..e899ece
--- /dev/null
@@ -0,0 +1,6 @@
+RUN: printf "warforpl" > %t
+RUN: not llvm-profdata show %t 2>&1 | FileCheck %s
+RUN: printf "lprofraw" > %t
+RUN: not llvm-profdata show %t 2>&1 | FileCheck %s
+
+CHECK: error: {{.+}}: Invalid header