diff options
author | Igor Kudrin <ikudrin.dev@gmail.com> | 2016-05-18 07:43:27 +0000 |
---|---|---|
committer | Igor Kudrin <ikudrin.dev@gmail.com> | 2016-05-18 07:43:27 +0000 |
commit | eb10307347fee33b9dda7a9567e6d69534d6040d (patch) | |
tree | d89f5358a199acf48351465f5f380d7aec29d9c2 /llvm/lib/ProfileData | |
parent | 095fc41523134084d37f549bc1f89dbf95db5a73 (diff) | |
download | bcm5719-llvm-eb10307347fee33b9dda7a9567e6d69534d6040d.tar.gz bcm5719-llvm-eb10307347fee33b9dda7a9567e6d69534d6040d.zip |
[Coverage] Ensure that coverage mapping data has an expected alignment in 'covmapping' files.
Coverage mapping data is organized in a sequence of blocks, each of which is expected
to be aligned by 8 bytes. This feature is used when reading those blocks, see
VersionedCovMapFuncRecordReader::readFunctionRecords(). If a misaligned covearge
mapping data has more than one block, it causes llvm-cov to fail.
Differential Revision: http://reviews.llvm.org/D20285
llvm-svn: 269887
Diffstat (limited to 'llvm/lib/ProfileData')
-rw-r--r-- | llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp b/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp index 9f27de91bc5..9920c338f2d 100644 --- a/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp +++ b/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp @@ -491,6 +491,13 @@ static std::error_code loadTestingFormat(StringRef Data, return coveragemap_error::malformed; ProfileNames.create(Data.substr(0, ProfileNamesSize), Address); CoverageMapping = Data.substr(ProfileNamesSize); + // Skip the padding bytes because coverage map data has an alignment of 8. + if (CoverageMapping.size() < 1) + return coveragemap_error::truncated; + size_t Pad = alignmentAdjustment(CoverageMapping.data(), 8); + if (CoverageMapping.size() < Pad) + return coveragemap_error::malformed; + CoverageMapping = CoverageMapping.substr(Pad); return std::error_code(); } |