From patchwork Tue Mar 18 17:00:47 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Burgess X-Patchwork-Id: 108317 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 4929F3858C78 for ; Tue, 18 Mar 2025 17:02:34 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4929F3858C78 Authentication-Results: sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=GmHVNsqb X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTP id 617143858CD1 for ; Tue, 18 Mar 2025 17:01:01 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 617143858CD1 Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 617143858CD1 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1742317261; cv=none; b=iLl3jfZ4l281u/ApklX5lTVx+ib+sGBOSMO7PDmorX4vW0+wa8qQBu+81i+tKi9jxbG4guh85R/S1usiXn4gmXVl0o2xgsT99zgPYIl2MQnjDi/QvWxqWZ8hV1Cou8QcSgJ88KEHCzgJYI6PN330czypyvS+rc5OD1C20jEwILk= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1742317261; c=relaxed/simple; bh=Tpj5rpw+DYxtnbNl37HcfntK4Nn47gQFTbkh3WM2amY=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=eWyZ4qvi0mq8Oo+vdI9koiC/3/Fd4O56n+xVNZHUubLyFGaskJ1Iki7csLvS07a6MbYWrOVjaHYaa2WX4avhPfp/sIMFMn72g717uy8NJuMOL2FGvyCum7SSP8wfKe9RcHTm0YC0r4BNIeuwA8FR+LIdAtiMqO7nAT2SnWxqx64= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 617143858CD1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1742317261; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=0Pq1cm8PTbHWqLjAh//hhA5Y/Yf96JpOUClzCvI3hmY=; b=GmHVNsqbLHM3tTPgVt+W1ZesiKuf5T9h+VZdn8xZJyDHsEHDRzhhTap52JKa+Cblf2G3q9 pi7bcvgQRls5F4y0KBesqYccYcRhlivoMreKnFokAtRfR66SlEirmkHEE6sM0OzkgSjF4a l/e8UUzWHPIr8cDJAar0BmOrsfF3ZUc= Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-164-TiPCn8s0Moy73iEfFdI_zQ-1; Tue, 18 Mar 2025 13:00:57 -0400 X-MC-Unique: TiPCn8s0Moy73iEfFdI_zQ-1 X-Mimecast-MFC-AGG-ID: TiPCn8s0Moy73iEfFdI_zQ_1742317256 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-43cec217977so24558145e9.0 for ; Tue, 18 Mar 2025 10:00:57 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742317255; x=1742922055; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=0Pq1cm8PTbHWqLjAh//hhA5Y/Yf96JpOUClzCvI3hmY=; b=FNX7imVH2sSFP1PCatYr11pbhHWGvSKRlD5+5FN8w1buKWXS5LsRPOys0b/Z6cklHm g8lIA/KjaUbEX5iUOxzZzjwfaIbtmpwSHmgRej49IPm62uA7VYZrzgxzhvAxOovyioHA OCT6cKzar/jtiLGHwX5pRYq7vgan0ftpAnCHTN7kiFoG3H0V0yfxF5lwTUvX0xEo04Ab ZzTjgjAzTk226A9+WbhW7Kpl2NDCyAKWEH/HNVc1gAPnytwe6AH8cd2bgiYvlVkWySny Q3CguKgJakNikueJZS8q9dPY0hqHPTZYESHttOP+rb0wiJGex0e/aArfGKM/zzZr/ofO Paxw== X-Gm-Message-State: AOJu0YzWSFQTMsH+Y6JERhdoOHaXexBmMfboI55t4G2T/OaQWrTsI3FE 3V5EF3CIE/+MAllo+RnK/vLSTzPTlMorgn/IwPmKwjtuVigSA5ckWcxJsBCxAkYx5DgDjCIEThs E8i/ku37xCTz5xwkrwdhjwSKTzBGWJ0meUOwqVoAdj5Oo49QyyqRMlQhxA9iFwZkYuU2B8d9Wmu R816QQOzO81xQX7jrFmYjl7fAX+nh28G4FZJEYK6aQKKw= X-Gm-Gg: ASbGncsIGkJePyASkKv9jOBQCukSBtQI8s98zDk4sSPzymROYyMY76Rb/rqVUlCqheg 9ua18UJhM1+ePG1D2syGOJQfXrd5Ew1GsR+pttR/t1aiCmOmEIsRSD+Mi7d/nbaHsV3N4Xkh1ZP +6IxVHVRk++N0r9+sYaDv5SViOVCkCQ7NcmIKNltaWyRqbSeAXakvRtMRzOQcwuOAFWBdp2xP9t aFS+Q1OiixHq30KfVxJLmBT7eMOzlw+QSaeg9VeksMzP6FIo5YvVJ3A5dfR9/3LK7LWsjU5sI9y 1mbCxdwGFhdTlv4opsWvP92oqUpYqZljvg8= X-Received: by 2002:a05:600c:3486:b0:43c:f3e4:d6f6 with SMTP id 5b1f17b1804b1-43d3ba3e406mr33786545e9.31.1742317254305; Tue, 18 Mar 2025 10:00:54 -0700 (PDT) X-Google-Smtp-Source: AGHT+IG4PyBQAPAh/Sb5bTAmIBjTT2gmCCeKymM0Mj7scSpi80dkP5XuBytVEQ3HzIuukdcowpOmCA== X-Received: by 2002:a05:600c:3486:b0:43c:f3e4:d6f6 with SMTP id 5b1f17b1804b1-43d3ba3e406mr33785555e9.31.1742317253489; Tue, 18 Mar 2025 10:00:53 -0700 (PDT) Received: from localhost (52.72.115.87.dyn.plus.net. [87.115.72.52]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-43d1fdda38esm143979175e9.8.2025.03.18.10.00.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Mar 2025 10:00:53 -0700 (PDT) From: Andrew Burgess To: gdb-patches@sourceware.org Cc: Andrew Burgess , Guinevere Larsen Subject: [PATCH 1/2] gdb: move remote arg splitting and joining into gdbsupport/ Date: Tue, 18 Mar 2025 17:00:47 +0000 Message-ID: <5d5d38644491a26cee8cd3618253c4b1cbcad0c3.1742317144.git.aburgess@redhat.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: References: MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: cxi_mxR6rkoPdFWY3riKBeUrB1grell2NehaQI89M3U_1742317256 X-Mimecast-Originator: redhat.com content-type: text/plain; charset="US-ASCII"; x-default=true X-Spam-Status: No, score=-10.4 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~patchwork=sourceware.org@sourceware.org This is a refactoring commit. When passing inferior arguments to gdbserver we have two actions that need to be performed, splitting and joining. On the GDB side, we take the inferior arguments, a single string, and split the string into a list of individual arguments. These are then sent to gdbserver over the remote protocol. On the gdbserver side we receive the list of individual arguments and join these back together into a single inferior argument string. In the next commit I plan to add some unit testing for this remote argument passing process. Ideally, for unit testing, we need the code being tested to be located in some easily callable function, rather than being inline at the site of use. So in this commit I propose to move the splitting and joining logic out into a separate file, we can then use this within GDB and gdbserver when passing arguments between GDB and gdbserver, but we can also call the same functions for some unit testing. In this commit I'm not adding the unit tests, they will be added next, so for now there should be no user visible changes after this commit. Tested-By: Guinevere Larsen --- gdb/remote.c | 12 ++++----- gdbserver/server.cc | 3 ++- gdbsupport/Makefile.am | 1 + gdbsupport/Makefile.in | 14 +++++----- gdbsupport/remote-args.cc | 43 ++++++++++++++++++++++++++++++ gdbsupport/remote-args.h | 55 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 115 insertions(+), 13 deletions(-) create mode 100644 gdbsupport/remote-args.cc create mode 100644 gdbsupport/remote-args.h diff --git a/gdb/remote.c b/gdb/remote.c index 66c58c884d3..64d11e19ff2 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -80,6 +80,7 @@ #include "async-event.h" #include "gdbsupport/selftest.h" #include "cli/cli-style.h" +#include "gdbsupport/remote-args.h" /* The remote target. */ @@ -10835,16 +10836,15 @@ remote_target::extended_remote_run (const std::string &args) if (!args.empty ()) { - int i; + std::vector split_args = gdb::remote_args::split (args); - gdb_argv argv (args.c_str ()); - for (i = 0; argv[i] != NULL; i++) + for (const auto &a : split_args) { - if (strlen (argv[i]) * 2 + 1 + len >= get_remote_packet_size ()) + if (a.size () * 2 + 1 + len >= get_remote_packet_size ()) error (_("Argument list too long for run packet")); rs->buf[len++] = ';'; - len += 2 * bin2hex ((gdb_byte *) argv[i], rs->buf.data () + len, - strlen (argv[i])); + len += 2 * bin2hex ((gdb_byte *) a.c_str (), rs->buf.data () + len, + a.size ()); } } diff --git a/gdbserver/server.cc b/gdbserver/server.cc index def01c1ee80..f4feb5906c4 100644 --- a/gdbserver/server.cc +++ b/gdbserver/server.cc @@ -51,6 +51,7 @@ #include "gdbsupport/scoped_restore.h" #include "gdbsupport/search.h" #include "gdbsupport/gdb_argv_vec.h" +#include "gdbsupport/remote-args.h" /* PBUFSIZ must also be at least as big as IPA_CMD_BUF_SIZE, because the client state data is passed directly to some agent @@ -3465,7 +3466,7 @@ handle_v_run (char *own_buf) else program_path.set (new_program_name.get ()); - program_args = construct_inferior_arguments (new_argv.get (), true); + program_args = gdb::remote_args::join (new_argv.get ()); try { diff --git a/gdbsupport/Makefile.am b/gdbsupport/Makefile.am index e77298751cd..9e7def7b830 100644 --- a/gdbsupport/Makefile.am +++ b/gdbsupport/Makefile.am @@ -80,6 +80,7 @@ libgdbsupport_a_SOURCES = \ pathstuff.cc \ print-utils.cc \ ptid.cc \ + remote-args.cc \ rsp-low.cc \ run-time-clock.cc \ safe-strerror.cc \ diff --git a/gdbsupport/Makefile.in b/gdbsupport/Makefile.in index db3d6f6b4dd..190b16f767e 100644 --- a/gdbsupport/Makefile.in +++ b/gdbsupport/Makefile.in @@ -163,12 +163,12 @@ am_libgdbsupport_a_OBJECTS = agent.$(OBJEXT) btrace-common.$(OBJEXT) \ gdb_tilde_expand.$(OBJEXT) gdb_wait.$(OBJEXT) \ gdb_vecs.$(OBJEXT) job-control.$(OBJEXT) netstuff.$(OBJEXT) \ new-op.$(OBJEXT) osabi.$(OBJEXT) pathstuff.$(OBJEXT) \ - print-utils.$(OBJEXT) ptid.$(OBJEXT) rsp-low.$(OBJEXT) \ - run-time-clock.$(OBJEXT) safe-strerror.$(OBJEXT) \ - scoped_mmap.$(OBJEXT) search.$(OBJEXT) signals.$(OBJEXT) \ - signals-state-save-restore.$(OBJEXT) task-group.$(OBJEXT) \ - tdesc.$(OBJEXT) thread-pool.$(OBJEXT) xml-utils.$(OBJEXT) \ - $(am__objects_1) $(am__objects_2) + print-utils.$(OBJEXT) ptid.$(OBJEXT) remote-args.$(OBJEXT) \ + rsp-low.$(OBJEXT) run-time-clock.$(OBJEXT) \ + safe-strerror.$(OBJEXT) scoped_mmap.$(OBJEXT) search.$(OBJEXT) \ + signals.$(OBJEXT) signals-state-save-restore.$(OBJEXT) \ + task-group.$(OBJEXT) tdesc.$(OBJEXT) thread-pool.$(OBJEXT) \ + xml-utils.$(OBJEXT) $(am__objects_1) $(am__objects_2) libgdbsupport_a_OBJECTS = $(am_libgdbsupport_a_OBJECTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) @@ -438,6 +438,7 @@ libgdbsupport_a_SOURCES = \ pathstuff.cc \ print-utils.cc \ ptid.cc \ + remote-args.cc \ rsp-low.cc \ run-time-clock.cc \ safe-strerror.cc \ @@ -548,6 +549,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pathstuff.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print-utils.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ptid.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/remote-args.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rsp-low.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/run-time-clock.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/safe-strerror.Po@am__quote@ diff --git a/gdbsupport/remote-args.cc b/gdbsupport/remote-args.cc new file mode 100644 index 00000000000..2493433cc62 --- /dev/null +++ b/gdbsupport/remote-args.cc @@ -0,0 +1,43 @@ +/* Copyright (C) 2023-2025 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include "gdbsupport/common-defs.h" +#include "gdbsupport/remote-args.h" +#include "gdbsupport/common-inferior.h" +#include "gdbsupport/buildargv.h" + +/* See remote-args.h. */ + +std::vector +gdb::remote_args::split (const std::string &args) +{ + std::vector results; + + gdb_argv argv (args.c_str ()); + for (int i = 0; argv[i] != nullptr; i++) + results.emplace_back (argv[i]); + + return results; +} + +/* See remote-args.h. */ + +std::string +gdb::remote_args::join (const std::vector &args) +{ + return construct_inferior_arguments (args, true); +} diff --git a/gdbsupport/remote-args.h b/gdbsupport/remote-args.h new file mode 100644 index 00000000000..93dbdc6bc96 --- /dev/null +++ b/gdbsupport/remote-args.h @@ -0,0 +1,55 @@ +/* Functions to help when passing arguments between GDB and gdbserver. + + Copyright (C) 2023-2025 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* The functions declared here are used when passing inferior arguments + from GDB to gdbserver. + + The remote protocol requires that arguments are passed as a vector of + separate argument while GDB stores the arguments as a single string, and + gdbserver also requires the arguments be a single string. + + These functions then provide a mechanism to split up an argument string + and recombine it within gdbserver while preserving escaping of special + characters within the argument string. */ + +namespace gdb +{ + +namespace remote_args +{ + +/* ARGS is an inferior argument string. This function splits ARGS into + individual arguments and returns a vector containing each argument. */ + +extern std::vector split (const std::string &args); + +/* Join together the separate arguments in ARGS and build a single + inferior argument string. The string returned by this function will be + equivalent, but not necessarily identical to the string passed to + ::split, for example passing the string '"a b"' (without the single + quotes, but including the double quotes) to ::split, will return an + argument of 'a b' (without the single quotes). When this argument is + passed through ::join we will get back the string 'a\ b' (without the + single quotes), that is, we choose to escape the white space, rather + than wrap the argument in quotes. */ +extern std::string join (const std::vector &args); + +} /* namespace remote_args */ + +} /* namespac gdb */ From patchwork Tue Mar 18 17:00:48 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Burgess X-Patchwork-Id: 108318 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id B9DC83858CD9 for ; Tue, 18 Mar 2025 17:03:44 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B9DC83858CD9 Authentication-Results: sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=VdIjZj8w X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTP id 3914C3858CD9 for ; Tue, 18 Mar 2025 17:01:02 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 3914C3858CD9 Authentication-Results: sourceware.org; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 3914C3858CD9 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1742317262; cv=none; b=WZOTrFygX0QjHjkCsmB9kbaMHn7gsY88ssN0qRDZYWbVB3M9NB5Jxd/W+vxzF/db4ILo5c1PzoqCoYJFfwvYlZH0bfvXQoba4VALGBa4ntnKpIBHK/GparDSTVTBhPI7cMvXKPm0cjSj80dLRUrsqUFFyPtZD5jE2jC/9BCyi7Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1742317262; c=relaxed/simple; bh=UjG/iN8Ylww3uw3RIGfNAX9OFFaIrrbfPcWeg9yO1U0=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=qIIDd2brqFxNScwb9pYQC1kFF/H8FHpJoLk+Xz3eAvbM+ll9K2uyM4+mKWYykY5k7xZlYgv7/Ch6S3nU4f+i5VbJ9Q9Nlt7Lrt2Er2fV5e9zFvt3GiTcOjHhWN0CPUODsFgkE3X3r3XXClwwHdmef7+uBhmdAoK6bG2u3aGO9Us= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 3914C3858CD9 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1742317262; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=7/Ee7fwCiTIY91DzVschG36GPeQIpmF6e6iDB5c/qpo=; b=VdIjZj8wbJ/VokR3IPn4lhNJilf6nzluxICYUeNE6KmcNkuOXxNAxD4iqvmA2J89VpHDTg V3I/m8uGhfsaKOlcRS3Ml2stdq+yOUdi6qybSz1IKM9Qcfru/KSJtRscgUgMOXOrPXCTYN cwq7oE5S2JyEKOyWm2Evfe31V8l/p+0= Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-500-Rz5WHDOvN8W2AZutlIW2AA-1; Tue, 18 Mar 2025 13:01:00 -0400 X-MC-Unique: Rz5WHDOvN8W2AZutlIW2AA-1 X-Mimecast-MFC-AGG-ID: Rz5WHDOvN8W2AZutlIW2AA_1742317258 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-43d01024089so28809155e9.1 for ; Tue, 18 Mar 2025 10:00:58 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742317258; x=1742922058; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=7/Ee7fwCiTIY91DzVschG36GPeQIpmF6e6iDB5c/qpo=; b=VFcRrk1NbpmEcXO0ef7JJVFL7x/AVn5g0zUdt2N/YyH5r9wLxZ8AhoDFblOHKmjdZd xf27smiQN4Ry21x4f9bYQF+rNZf1OL8hl3n6u7O/bfQuCBXGlgRs4S9fnixhlkaIh7Cd Vu3ZT+qWIDEyJ/804RcfcP28BLudfL+bG6k5k2gCnoBo3R43zZ9swvRHbdp4xF45Kr5s clJm9oiVtD5l502Y2X8xLssd6ovmh+nQ/qMiEeFpOLHI5WVkqKzlVpYFUpjxD2AVRtRT kDmWK4S5OiiOKWcY3rZY1fP1mLWWAWs2qeUIWbqdltrzXWg1rKBjToBcjtlyb9xLouY/ LunQ== X-Gm-Message-State: AOJu0YyU51ehxJuLNfi6lUfLLkL2QjFtbli6zVFf3KC0qII71PKAP4C2 ma2gpwI/hvrm8pHarPnd6O+/qnMekbXgLHklInYyd0aG7dG8MKYbF/2UylKwinA9NPQ5WQOfHf5 zDPr5HTMATh2KcPx+N6+OwZIyFaXqxlLspQ6N2ZzSMkoG6JXpQqTZV21gpG0uM6y+PKdGYkAQpX Wo524vN0a1c+ttijrtHOxJsMVvxmqIGUA1+K8VgCXeuas= X-Gm-Gg: ASbGncvEoQa0MYjEzWaPPstH5wxUeSl0FEOUeE057d58nUF/wcD/Snh15EsJ3mECmlL prjmZCtB+owMkL/YsasvMAkaLAc1vAFW2h5mVzd2JZOxl2/UqhvgxKuGLXzUIEuSAbZGBLda3xq orbeSEsPiT/A7rCdS79euoFUoonQzlV4qQEV4a3nxMuc0ix7oVUW6SvL8xKUJb0OGkRK8UN/oh9 iqr+WdVYexUeDZk0BifBqpvjiXm09roKtJuard8oyH/HW+9R01XD1et8GAqnAwbHMNK/ogRi/M/ UDEXbaSpN8ep5zEuyRTPiTTsHcXaQIFCMyQ= X-Received: by 2002:a05:6000:1f82:b0:391:11b:c7e9 with SMTP id ffacd0b85a97d-3971ee43e56mr14445738f8f.28.1742317257401; Tue, 18 Mar 2025 10:00:57 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHaFc/y4Uy/avQuaqg5Cx+3v19jiMPSLpD31Pe91xuI6rohyix3kQ31QHJJcA/tSRFaCLr3MQ== X-Received: by 2002:a05:6000:1f82:b0:391:11b:c7e9 with SMTP id ffacd0b85a97d-3971ee43e56mr14445663f8f.28.1742317256489; Tue, 18 Mar 2025 10:00:56 -0700 (PDT) Received: from localhost (52.72.115.87.dyn.plus.net. [87.115.72.52]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-395c83b7656sm18246990f8f.40.2025.03.18.10.00.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 18 Mar 2025 10:00:54 -0700 (PDT) From: Andrew Burgess To: gdb-patches@sourceware.org Cc: Andrew Burgess , Guinevere Larsen Subject: [PATCH 2/2] gdb: add remote argument passing unit tests Date: Tue, 18 Mar 2025 17:00:48 +0000 Message-ID: <1dcca70e6c7d934a12ae873528b2ca5b36a748c1.1742317144.git.aburgess@redhat.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: References: MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: qBlS9BWExV1NtD55vlTyfsFKdFTfnQNfsrUKYRwvRTk_1742317258 X-Mimecast-Originator: redhat.com content-type: text/plain; charset="US-ASCII"; x-default=true X-Spam-Status: No, score=-10.4 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_BARRACUDACENTRAL, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~patchwork=sourceware.org@sourceware.org This commit adds some remote argument passing unit tests. There are not many tests right now -- there are known bugs in the remote argument passing mechanism (see PR gdb/28392) -- but some simple cases are covered here, and I plan to add additional tests once I've fixed more of the problems with the existing argument handling code. The tests take an inferior argument string, this is the string that GDB would carry around as inferior::m_args. This string is then split using gdb::remote_args::split, this gives a vector of strings, these are the strings that are passed over the remote protocol. These split strings are validated as part of the test. The split strings are then combined using gdb::remote_args::join which gives the inferior argument string that gdbserver will use, this is held in server.cc as program_args, this joined string is then checked as part of the test. There are no changes to GDB's behaviour as part of this commit, other than adding the new tests which can be run with: (gdb) maintenance selftest remote-args Running selftest remote-args. Ran 1 unit tests, 0 failed Tested-By: Guinevere Larsen --- gdb/Makefile.in | 1 + gdb/unittests/remote-arg-selftests.c | 166 +++++++++++++++++++++++++++ 2 files changed, 167 insertions(+) create mode 100644 gdb/unittests/remote-arg-selftests.c diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 8f6df5ba7b6..64a8cc2a226 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -479,6 +479,7 @@ SELFTESTS_SRCS = \ unittests/ptid-selftests.c \ unittests/main-thread-selftests.c \ unittests/mkdir-recursive-selftests.c \ + unittests/remote-arg-selftests.c \ unittests/rsp-low-selftests.c \ unittests/scoped_fd-selftests.c \ unittests/scoped_ignore_signal-selftests.c \ diff --git a/gdb/unittests/remote-arg-selftests.c b/gdb/unittests/remote-arg-selftests.c new file mode 100644 index 00000000000..70f8a397157 --- /dev/null +++ b/gdb/unittests/remote-arg-selftests.c @@ -0,0 +1,166 @@ +/* Self tests for GDB's argument splitting and merging. + + Copyright (C) 2023-2025 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include "defs.h" +#include "gdbsupport/selftest.h" +#include "gdbsupport/buildargv.h" +#include "gdbsupport/common-inferior.h" +#include "gdbsupport/remote-args.h" +#include "gdbsupport/gdb_argv_vec.h" + +namespace selftests { +namespace remote_args_tests { + +/* The data needed to perform a single remote argument test. */ +struct arg_test_desc +{ + /* The original inferior argument string. */ + std::string input; + + /* The individual arguments once they have been split. */ + std::vector split; + + /* The new inferior argument string, created by joining SPLIT. */ + std::string joined; +}; + +/* The list of tests. */ +arg_test_desc desc[] = { + { "abc", { "abc" }, "abc" }, + { "a b c", { "a", "b", "c" }, "a b c" }, + { "\"a b\" 'c d'", { "a b", "c d" }, "a\\ b c\\ d" }, + { "\\' \\\"", { "'", "\"" }, "\\' \\\"" }, + { "'\\'", { "\\" }, "\\\\" }, + { "\"\\\\\" \"\\\\\\\"\"", { "\\", "\\\"" }, "\\\\ \\\\\\\"" }, + { "\\ \" \" ' '", { " ", " ", " "}, "\\ \\ \\ " }, + { "\"'\"", { "'" }, "\\'" }, + { "'\"' '\\\"'", { "\"", "\\\"" } , "\\\" \\\\\\\""}, + { "\"first arg\" \"\" \"third-arg\" \"'\" \"\\\"\" \"\\\\\\\"\" \" \" \"\"", + { "first arg", "", "third-arg", "'", "\"", "\\\""," ", "" }, + "first\\ arg '' third-arg \\' \\\" \\\\\\\" \\ ''"}, + { "\"\\a\" \"\\&\" \"\\#\" \"\\<\" \"\\^\"", + { "\\a", "\\&", "\\#" , "\\<" , "\\^"}, + "\\\\a \\\\\\& \\\\\\# \\\\\\< \\\\\\^" }, + { "1 '\n' 3", { "1", "\n", "3" }, "1 '\n' 3" }, +}; + +/* Run the remote argument passing self tests. */ + +static void +self_test () +{ + int failure_count = 0; + for (const auto &d : desc) + { + if (run_verbose ()) + { + if (&d != &desc[0]) + debug_printf ("------------------------------\n"); + debug_printf ("Input (%s)\n", d.input.c_str ()); + } + + /* Split argument string into individual arguments. */ + std::vector split_args = gdb::remote_args::split (d.input); + + if (run_verbose ()) + { + debug_printf ("Split:\n"); + + size_t len = std::max (split_args.size (), d.split.size ()); + for (size_t i = 0; i < len; ++i) + { + const char *got = "N/A"; + const char *expected = got; + + if (i < split_args.size ()) + got = split_args[i].c_str (); + + if (i < d.split.size ()) + expected = d.split[i].c_str (); + + debug_printf (" got (%s), expected (%s)\n", got, expected); + } + } + + if (split_args != d.split) + { + ++failure_count; + if (run_verbose ()) + debug_printf ("FAIL\n"); + continue; + } + + /* Now join the arguments. */ + gdb::argv_vec split_args_c_str; + for (const std::string &s : split_args) + split_args_c_str.push_back (xstrdup (s.c_str ())); + std::string joined_args + = gdb::remote_args::join (split_args_c_str.get ()); + + if (run_verbose ()) + debug_printf ("Joined (%s), expected (%s)\n", + joined_args.c_str (), d.joined.c_str ()); + + if (joined_args != d.joined) + { + ++failure_count; + if (run_verbose ()) + debug_printf ("FAIL\n"); + continue; + } + + /* The contents of JOINED_ARGS will not be identical to D.INPUT. + There are multiple ways that an argument can be escaped, and our + join function just picks one. However, if we split JOINED_ARGS + again then each individual argument should be the same as those in + SPLIT_ARGS. So test that next. */ + std::vector split_args_v2 + = gdb::remote_args::split (joined_args); + + if (split_args_v2 != split_args) + { + ++failure_count; + if (run_verbose ()) + { + debug_printf ("Re-split:\n"); + for (const auto &a : split_args_v2) + debug_printf (" got (%s)\n", a.c_str ()); + debug_printf ("FAIL\n"); + } + continue; + } + + if (run_verbose ()) + debug_printf ("PASS\n"); + } + + SELF_CHECK (failure_count == 0); +} + +} /* namespace remote_args_tests */ +} /* namespace selftests */ + +void _initialize_remote_arg_selftests (); + +void +_initialize_remote_arg_selftests () +{ + selftests::register_test ("remote-args", + selftests::remote_args_tests::self_test); +}