Author: hokein Date: Tue Jan 8 07:24:47 2019 New Revision: 350633 URL: http://llvm.org/viewvc/llvm-project?rev=350633&view=rev Log: [clangd] Fix a crash when reading an empty index file.
Summary: Unfortunately, yaml::Input::setCurrentDocument() and yaml::Input::nextDocument() are internal APIs, the way we use them may cause a nullptr accessing when processing an empty YAML file. Reviewers: ilya-biryukov Subscribers: ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits Differential Revision: https://reviews.llvm.org/D56442 Modified: clang-tools-extra/trunk/clangd/index/YAMLSerialization.cpp clang-tools-extra/trunk/unittests/clangd/SerializationTests.cpp Modified: clang-tools-extra/trunk/clangd/index/YAMLSerialization.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/index/YAMLSerialization.cpp?rev=350633&r1=350632&r2=350633&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/index/YAMLSerialization.cpp (original) +++ clang-tools-extra/trunk/clangd/index/YAMLSerialization.cpp Tue Jan 8 07:24:47 2019 @@ -314,17 +314,20 @@ llvm::Expected<IndexFileIn> readYAML(llv Arena; // store the underlying data of Position::FileURI. llvm::UniqueStringSaver Strings(Arena); llvm::yaml::Input Yin(Data, &Strings); - do { + while (Yin.setCurrentDocument()) { + llvm::yaml::EmptyContext Ctx; VariantEntry Variant; - Yin >> Variant; + yamlize(Yin, Variant, true, Ctx); if (Yin.error()) return llvm::errorCodeToError(Yin.error()); + if (Variant.Symbol) Symbols.insert(*Variant.Symbol); if (Variant.Refs) for (const auto &Ref : Variant.Refs->second) Refs.insert(Variant.Refs->first, Ref); - } while (Yin.nextDocument()); + Yin.nextDocument(); + } IndexFileIn Result; Result.Symbols.emplace(std::move(Symbols).build()); Modified: clang-tools-extra/trunk/unittests/clangd/SerializationTests.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clangd/SerializationTests.cpp?rev=350633&r1=350632&r2=350633&view=diff ============================================================================== --- clang-tools-extra/trunk/unittests/clangd/SerializationTests.cpp (original) +++ clang-tools-extra/trunk/unittests/clangd/SerializationTests.cpp Tue Jan 8 07:24:47 2019 @@ -91,6 +91,10 @@ MATCHER_P2(IncludeHeaderWithRef, Include return (arg.IncludeHeader == IncludeHeader) && (arg.References == References); } +TEST(SerializationTest, NoCrashOnEmptyYAML) { + EXPECT_TRUE(bool(readIndexFile(""))); +} + TEST(SerializationTest, YAMLConversions) { auto In = readIndexFile(YAML); EXPECT_TRUE(bool(In)) << In.takeError(); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits