From c2d4280328e4f69fd9e1258196e9dbc8362fce95 Mon Sep 17 00:00:00 2001 From: Sam McCall Date: Fri, 9 Oct 2020 16:06:46 +0200 Subject: [PATCH] [clangd] Validate optional fields more strictly. Differential Revision: https://reviews.llvm.org/D89131 --- clang-tools-extra/clangd/Protocol.cpp | 67 +++++++++++++---------------------- 1 file changed, 24 insertions(+), 43 deletions(-) diff --git a/clang-tools-extra/clangd/Protocol.cpp b/clang-tools-extra/clangd/Protocol.cpp index f8aca22..f41cea2 100644 --- a/clang-tools-extra/clangd/Protocol.cpp +++ b/clang-tools-extra/clangd/Protocol.cpp @@ -484,12 +484,10 @@ bool fromJSON(const llvm::json::Value &Params, DidSaveTextDocumentParams &R, bool fromJSON(const llvm::json::Value &Params, DidChangeTextDocumentParams &R, llvm::json::Path P) { llvm::json::ObjectMapper O(Params, P); - if (!O) - return false; - O.map("forceRebuild", R.forceRebuild); // Optional clangd extension. - return O.map("textDocument", R.textDocument) && + return O && O.map("textDocument", R.textDocument) && O.map("contentChanges", R.contentChanges) && - O.map("wantDiagnostics", R.wantDiagnostics); + O.map("wantDiagnostics", R.wantDiagnostics) && + O.mapOptional("forceRebuild", R.forceRebuild); } bool fromJSON(const llvm::json::Value &E, FileChangeType &Out, @@ -578,12 +576,10 @@ llvm::json::Value toJSON(const Diagnostic &D) { bool fromJSON(const llvm::json::Value &Params, Diagnostic &R, llvm::json::Path P) { llvm::json::ObjectMapper O(Params, P); - if (!O || !O.map("range", R.range) || !O.map("message", R.message)) - return false; - O.map("severity", R.severity); - O.map("category", R.category); - O.map("code", R.code); - O.map("source", R.source); + return O && O.map("range", R.range) && O.map("message", R.message) && + O.mapOptional("severity", R.severity) && + O.mapOptional("category", R.category) && + O.mapOptional("code", R.code) && O.mapOptional("source", R.source); return true; } @@ -800,10 +796,8 @@ llvm::json::Value toJSON(const ApplyWorkspaceEditParams &Params) { bool fromJSON(const llvm::json::Value &Response, ApplyWorkspaceEditResponse &R, llvm::json::Path P) { llvm::json::ObjectMapper O(Response, P); - if (!O || !O.map("applied", R.applied)) - return false; - O.map("failureReason", R.failureReason); - return true; + return O && O.map("applied", R.applied) && + O.map("failureReason", R.failureReason); } bool fromJSON(const llvm::json::Value &Params, TextDocumentPositionParams &R, @@ -816,16 +810,11 @@ bool fromJSON(const llvm::json::Value &Params, TextDocumentPositionParams &R, bool fromJSON(const llvm::json::Value &Params, CompletionContext &R, llvm::json::Path P) { llvm::json::ObjectMapper O(Params, P); - if (!O) - return false; - int TriggerKind; - if (!O.map("triggerKind", TriggerKind)) + if (!O || !O.map("triggerKind", TriggerKind) || + !O.mapOptional("triggerCharacter", R.triggerCharacter)) return false; R.triggerKind = static_cast(TriggerKind); - - if (auto *TC = Params.getAsObject()->get("triggerCharacter")) - return fromJSON(*TC, R.triggerCharacter, P.field("triggerCharacter")); return true; } @@ -1126,8 +1115,8 @@ bool fromJSON(const llvm::json::Value &Params, ConfigurationSettings &S, llvm::json::ObjectMapper O(Params, P); if (!O) return true; // 'any' type in LSP. - O.map("compilationDatabaseChanges", S.compilationDatabaseChanges); - return true; + return O.mapOptional("compilationDatabaseChanges", + S.compilationDatabaseChanges); } bool fromJSON(const llvm::json::Value &Params, InitializationOptions &Opts, @@ -1136,11 +1125,10 @@ bool fromJSON(const llvm::json::Value &Params, InitializationOptions &Opts, if (!O) return true; // 'any' type in LSP. - fromJSON(Params, Opts.ConfigSettings, P); - O.map("compilationDatabasePath", Opts.compilationDatabasePath); - O.map("fallbackFlags", Opts.fallbackFlags); - O.map("clangdFileStatus", Opts.FileStatus); - return true; + return fromJSON(Params, Opts.ConfigSettings, P) && + O.map("compilationDatabasePath", Opts.compilationDatabasePath) && + O.mapOptional("fallbackFlags", Opts.fallbackFlags) && + O.mapOptional("clangdFileStatus", Opts.FileStatus); } bool fromJSON(const llvm::json::Value &E, TypeHierarchyDirection &Out, @@ -1193,20 +1181,13 @@ bool fromJSON(const llvm::json::Value &Params, TypeHierarchyItem &I, llvm::json::ObjectMapper O(Params, P); // Required fields. - if (!(O && O.map("name", I.name) && O.map("kind", I.kind) && - O.map("uri", I.uri) && O.map("range", I.range) && - O.map("selectionRange", I.selectionRange))) { - return false; - } - - // Optional fields. - O.map("detail", I.detail); - O.map("deprecated", I.deprecated); - O.map("parents", I.parents); - O.map("children", I.children); - O.map("data", I.data); - - return true; + return O && O.map("name", I.name) && O.map("kind", I.kind) && + O.map("uri", I.uri) && O.map("range", I.range) && + O.map("selectionRange", I.selectionRange) && + O.mapOptional("detail", I.detail) && + O.mapOptional("deprecated", I.deprecated) && + O.mapOptional("parents", I.parents) && + O.mapOptional("children", I.children) && O.mapOptional("data", I.data); } bool fromJSON(const llvm::json::Value &Params, -- 2.7.4