From eb10307347fee33b9dda7a9567e6d69534d6040d Mon Sep 17 00:00:00 2001 From: Igor Kudrin Date: Wed, 18 May 2016 07:43:27 +0000 Subject: [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 --- llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp') diff --git a/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp b/llvm/lib/ProfileData/Coverage/CoverageMappingReader.cpp index 9f27de9..9920c33 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(); } -- cgit v1.1