[clangd] Harden clangd a bit against garbage input.
authorBenjamin Kramer <benny.kra@googlemail.com>
Fri, 27 Oct 2017 16:33:15 +0000 (16:33 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Fri, 27 Oct 2017 16:33:15 +0000 (16:33 +0000)
There can be nullptrs here if the YAML fails to parse. Found by
clangd-fuzzer!

llvm-svn: 316770

clang-tools-extra/clangd/JSONRPCDispatcher.cpp

index 7e0aea5..5e48a07 100644 (file)
@@ -88,11 +88,7 @@ bool JSONRPCDispatcher::call(StringRef Content, JSONOutput &Out) const {
   if (Doc == YAMLStream.end())
     return false;
 
-  auto *Root = Doc->getRoot();
-  if (!Root)
-    return false;
-
-  auto *Object = dyn_cast<llvm::yaml::MappingNode>(Root);
+  auto *Object = dyn_cast_or_null<llvm::yaml::MappingNode>(Doc->getRoot());
   if (!Object)
     return false;
 
@@ -101,7 +97,8 @@ bool JSONRPCDispatcher::call(StringRef Content, JSONOutput &Out) const {
   llvm::yaml::MappingNode *Params = nullptr;
   llvm::yaml::ScalarNode *Id = nullptr;
   for (auto &NextKeyValue : *Object) {
-    auto *KeyString = dyn_cast<llvm::yaml::ScalarNode>(NextKeyValue.getKey());
+    auto *KeyString =
+        dyn_cast_or_null<llvm::yaml::ScalarNode>(NextKeyValue.getKey());
     if (!KeyString)
       return false;