]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
Add quoting to 'file' invocations in DAP
authorTom Tromey <tromey@adacore.com>
Wed, 11 Sep 2024 15:25:45 +0000 (09:25 -0600)
committerTom Tromey <tromey@adacore.com>
Fri, 13 Sep 2024 15:34:50 +0000 (09:34 -0600)
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 quoting to the
command in an attempt to fix this.

gdb/python/lib/gdb/dap/launch.py

index 2674e02eac3f9f4fe51e3631f596f3a0401b94d3..df1f667237b04c5962ae64ec23f5fb7e4837a806 100644 (file)
@@ -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: