[PATCH V2] gdb dap: quote program backslashes in launch.py

Tom Tromey tromey@adacore.com
Wed Sep 11 15:59:58 GMT 2024


>>>>> "Oleg" == Oleg Tolmatcev <oleg.tolmatcev@gmail.com> writes:

Oleg> in the second version I moved the quoting code to launch.py

Thanks for the patch.

It seems to me that there could be other issues here, particularly with
spaces.  This came up in a different context (see the recent patch for
gdb-add-index).

I wonder if you could try the appended patch instead?
If this works for you, I will check it in.

Tom

commit 1d464edf812ae2fb9c6d02a5fe542d5774ffbb2e
Author: Tom Tromey <tromey@adacore.com>
Date:   Wed Sep 11 09:25:45 2024 -0600

    Add quotes to 'file' invocations in DAP
    
    Oleg Tolmatcev noticed that DAP launch and attach requests don't
    properly handle Windows filenames, because "file" doesn't handle the
    backslash characters correctly.  This patch adds quotes to the command
    in an attempt to fix this.

diff --git a/gdb/python/lib/gdb/dap/launch.py b/gdb/python/lib/gdb/dap/launch.py
index 2674e02eac3..df1f667237b 100644
--- a/gdb/python/lib/gdb/dap/launch.py
+++ b/gdb/python/lib/gdb/dap/launch.py
@@ -13,6 +13,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
+import re
+
 # These are deprecated in 3.9, but required in older versions.
 from typing import Mapping, Optional, Sequence
 
@@ -20,7 +22,16 @@ import gdb
 
 from .events import exec_and_expect_stop, expect_process, expect_stop
 from .server import capability, request
-from .startup import DAPException, exec_and_log
+from .startup import DAPException, exec_and_log, in_gdb_thread
+
+
+# A wrapper for the 'file' command that correctly quotes its argument.
+@in_gdb_thread
+def file_command(program):
+    # Handle whitespace, quotes, and backslashes here.  Exactly what
+    # to quote depends on libiberty's buildargv and safe-ctype.
+    program = re.sub("[ \t\n\r\f\v\\\\'\"]", "\\\\\\g<0>", program)
+    exec_and_log("file " + program)
 
 
 # Any parameters here are necessarily extensions -- DAP requires this
@@ -39,7 +50,7 @@ def launch(
     if cwd is not None:
         exec_and_log("cd " + cwd)
     if program is not None:
-        exec_and_log("file " + program)
+        file_command(program)
     inf = gdb.selected_inferior()
     if stopAtBeginningOfMainSubprogram:
         main = inf.main_name
@@ -63,7 +74,7 @@ def attach(
     **args,
 ):
     if program is not None:
-        exec_and_log("file " + program)
+        file_command(program)
     if pid is not None:
         cmd = "attach " + str(pid)
     elif target is not None:


More information about the Gdb-patches mailing list