From 80a00cd24152b04cfc0205ccd9456da9c00da67d Mon Sep 17 00:00:00 2001 From: Anthony Eid <56899983+Anthony-Eid@users.noreply.github.com> Date: Thu, 22 May 2025 07:25:07 -0400 Subject: [PATCH] debugger beta: Fix panic that could occur when parsing an invalid dap schema (#31175) Release Notes: - N/A --- crates/dap/src/adapters.rs | 7 ++++--- crates/dap_adapters/src/go.rs | 5 ++++- crates/dap_adapters/src/php.rs | 10 +++++++++- crates/dap_adapters/src/python.rs | 5 ++++- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/crates/dap/src/adapters.rs b/crates/dap/src/adapters.rs index ebab0ecb1b..73e2881521 100644 --- a/crates/dap/src/adapters.rs +++ b/crates/dap/src/adapters.rs @@ -375,9 +375,10 @@ pub trait DebugAdapter: 'static + Send + Sync { ) -> Result { let map = config.as_object().context("Config isn't an object")?; - let request_variant = map["request"] - .as_str() - .ok_or_else(|| anyhow!("request is not valid"))?; + let request_variant = map + .get("request") + .and_then(|val| val.as_str()) + .context("request argument is not found or invalid")?; match request_variant { "launch" => Ok(StartDebuggingRequestArgumentsRequest::Launch), diff --git a/crates/dap_adapters/src/go.rs b/crates/dap_adapters/src/go.rs index 8971605a5c..699b9f8ee8 100644 --- a/crates/dap_adapters/src/go.rs +++ b/crates/dap_adapters/src/go.rs @@ -289,7 +289,10 @@ impl DebugAdapter for GoDebugAdapter { ) -> Result { let map = config.as_object().context("Config isn't an object")?; - let request_variant = map["request"].as_str().context("request is not valid")?; + let request_variant = map + .get("request") + .and_then(|val| val.as_str()) + .context("request argument is not found or invalid")?; match request_variant { "launch" => Ok(StartDebuggingRequestArgumentsRequest::Launch), diff --git a/crates/dap_adapters/src/php.rs b/crates/dap_adapters/src/php.rs index 1d787d9a68..cfb31c5bd5 100644 --- a/crates/dap_adapters/src/php.rs +++ b/crates/dap_adapters/src/php.rs @@ -2,6 +2,7 @@ use adapters::latest_github_release; use anyhow::Context as _; use anyhow::bail; use dap::StartDebuggingRequestArguments; +use dap::StartDebuggingRequestArgumentsRequest; use dap::adapters::{DebugTaskDefinition, TcpArguments}; use gpui::{AsyncApp, SharedString}; use language::LanguageName; @@ -46,6 +47,13 @@ impl PhpDebugAdapter { }) } + fn validate_config( + &self, + _: &serde_json::Value, + ) -> Result { + Ok(StartDebuggingRequestArgumentsRequest::Launch) + } + async fn get_installed_binary( &self, delegate: &Arc, @@ -93,7 +101,7 @@ impl PhpDebugAdapter { envs: HashMap::default(), request_args: StartDebuggingRequestArguments { configuration: task_definition.config.clone(), - request: dap::StartDebuggingRequestArgumentsRequest::Launch, + request: self.validate_config(&task_definition.config)?, }, }) } diff --git a/crates/dap_adapters/src/python.rs b/crates/dap_adapters/src/python.rs index 1f0fdb7c3f..f9112d4137 100644 --- a/crates/dap_adapters/src/python.rs +++ b/crates/dap_adapters/src/python.rs @@ -201,7 +201,10 @@ impl DebugAdapter for PythonDebugAdapter { ) -> Result { let map = config.as_object().context("Config isn't an object")?; - let request_variant = map["request"].as_str().context("request is not valid")?; + let request_variant = map + .get("request") + .and_then(|val| val.as_str()) + .context("request is not valid")?; match request_variant { "launch" => Ok(StartDebuggingRequestArgumentsRequest::Launch),