aboutsummaryrefslogtreecommitdiff
path: root/clang-tools-extra
diff options
context:
space:
mode:
authorHaojian Wu <hokein@google.com>2019-01-08 15:24:47 +0000
committerHaojian Wu <hokein@google.com>2019-01-08 15:24:47 +0000
commit073d184ee37d0daf5e944740635121f73a59c66b (patch)
tree2b49bf61310360cc605cce47e3fdc16805db18f5 /clang-tools-extra
parent59e373fd635f1fbc21236e1389a43a091edd9fe1 (diff)
[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 llvm-svn: 350633
Diffstat (limited to 'clang-tools-extra')
-rw-r--r--clang-tools-extra/clangd/index/YAMLSerialization.cpp9
-rw-r--r--clang-tools-extra/unittests/clangd/SerializationTests.cpp4
2 files changed, 10 insertions, 3 deletions
diff --git a/clang-tools-extra/clangd/index/YAMLSerialization.cpp b/clang-tools-extra/clangd/index/YAMLSerialization.cpp
index 27ed299e395d..7eb5b4cf830b 100644
--- a/clang-tools-extra/clangd/index/YAMLSerialization.cpp
+++ b/clang-tools-extra/clangd/index/YAMLSerialization.cpp
@@ -314,17 +314,20 @@ llvm::Expected<IndexFileIn> readYAML(llvm::StringRef Data) {
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());
diff --git a/clang-tools-extra/unittests/clangd/SerializationTests.cpp b/clang-tools-extra/unittests/clangd/SerializationTests.cpp
index fe571c4a7e96..a8ffaa1cb5c6 100644
--- a/clang-tools-extra/unittests/clangd/SerializationTests.cpp
+++ b/clang-tools-extra/unittests/clangd/SerializationTests.cpp
@@ -91,6 +91,10 @@ MATCHER_P2(IncludeHeaderWithRef, IncludeHeader, References, "") {
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();