diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2017-10-27 16:33:15 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2017-10-27 16:33:15 +0000 |
commit | 130858aa6b190d5220f912da53eeb258a45c0aee (patch) | |
tree | 7f86bf44e99d94aec4db239e8c370f835bebf236 | |
parent | d5f825bfa672da92767d1ef907e45a1cc625b1ca (diff) |
[clangd] Harden clangd a bit against garbage input.
There can be nullptrs here if the YAML fails to parse. Found by
clangd-fuzzer!
git-svn-id: https://llvm.org/svn/llvm-project/clang-tools-extra/trunk@316770 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | clangd/JSONRPCDispatcher.cpp | 9 |
1 files changed, 3 insertions, 6 deletions
diff --git a/clangd/JSONRPCDispatcher.cpp b/clangd/JSONRPCDispatcher.cpp index 7e0aea5f..5e48a071 100644 --- a/clangd/JSONRPCDispatcher.cpp +++ b/clangd/JSONRPCDispatcher.cpp @@ -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; |