From 2172c3a3c84ed86d7e0e02347f92582a03288f17 Mon Sep 17 00:00:00 2001 From: Justin Bogner Date: Sat, 20 Jun 2015 22:31:04 +0000 Subject: [PATCH] ASTReader: Copy input file offset data to avoid unaligned accesses We interpret Blob as an array of uint64_t here, but there's no reason to think that it has suitable alignment. Instead, read the data in in an alignment-safe way and store it in a std::vector. This fixes 225 test failures when clang is built with ubsan. llvm-svn: 240228 --- clang/include/clang/Serialization/Module.h | 2 +- clang/lib/Serialization/ASTReader.cpp | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/clang/include/clang/Serialization/Module.h b/clang/include/clang/Serialization/Module.h index 5571d91..48715e3 100644 --- a/clang/include/clang/Serialization/Module.h +++ b/clang/include/clang/Serialization/Module.h @@ -206,7 +206,7 @@ public: llvm::BitstreamCursor InputFilesCursor; /// \brief Offsets for all of the input file entries in the AST file. - const uint64_t *InputFileOffsets; + std::vector InputFileOffsets; /// \brief The input files that have been loaded from this AST file. std::vector InputFilesLoaded; diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index d75b5eb7..af6f92a 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -2304,13 +2304,21 @@ ASTReader::ReadControlBlock(ModuleFile &F, return Result; break; - case INPUT_FILE_OFFSETS: + case INPUT_FILE_OFFSETS: { NumInputs = Record[0]; NumUserInputs = Record[1]; - F.InputFileOffsets = (const uint64_t *)Blob.data(); + F.InputFileOffsets.clear(); + F.InputFileOffsets.reserve(NumInputs); + using namespace llvm::support; + const char *Buf = Blob.data(); + for (unsigned int I = 0; I < NumInputs; ++I) + F.InputFileOffsets.push_back( + endian::readNext(Buf)); + F.InputFilesLoaded.resize(NumInputs); break; } + } } } -- 2.7.4