From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id hUneN8PrkmDGCgAAWB0awg (envelope-from ) for ; Wed, 05 May 2021 15:02:27 -0400 Received: by simark.ca (Postfix, from userid 112) id D79571F11C; Wed, 5 May 2021 15:02:27 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,MAILING_LIST_MULTI,RDNS_DYNAMIC,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from sourceware.org (ip-8-43-85-97.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 1823D1E54D for ; Wed, 5 May 2021 15:02:27 -0400 (EDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 94A493857807; Wed, 5 May 2021 19:02:26 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 94A493857807 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1620241346; bh=ik1khCXBx823wyvT7qUO+iYoRaMbMl6bW8jkIMg/hI8=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=m4+CPJiCKuu21oY9f9LYZpM7XKR5j5xZBCWh/I8A9GZvTgqwCWssJgwh80hW9V5D/ u6wLxmbxOXxenCKprOrU3x8dKlHUA3lCWnh9p4iUSNmej5P1dfR+FcQjUFr+InvcgQ Ct50MYJWZ7sieYFsj34GitMfo0OWk6mWp4HL7RQ4= Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) by sourceware.org (Postfix) with ESMTP id 3B64E3857807 for ; Wed, 5 May 2021 19:02:23 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 3B64E3857807 Received: from vapier.lan (localhost [127.0.0.1]) by smtp.gentoo.org (Postfix) with ESMTP id 716B8340EB8 for ; Wed, 5 May 2021 19:02:22 +0000 (UTC) To: gdb-patches@sourceware.org Subject: [PATCH] sim: m32c/rl78/rx: fix command parsing Date: Wed, 5 May 2021 15:02:20 -0400 Message-Id: <20210505190220.28848-1-vapier@gentoo.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <87k0odqe9w.fsf@tromey.com> References: <87k0odqe9w.fsf@tromey.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Mike Frysinger via Gdb-patches Reply-To: Mike Frysinger Errors-To: gdb-patches-bounces@sourceware.org Sender: "Gdb-patches" Use buildargv to avoid writing to const memory and freeing invalid pointers, and to avoid doing any string parsing ourselves. --- sim/m32c/gdb-if.c | 36 ++++++++++++------------------------ sim/rl78/gdb-if.c | 41 +++++++++++++---------------------------- sim/rx/gdb-if.c | 38 +++++++++++++------------------------- 3 files changed, 38 insertions(+), 77 deletions(-) diff --git a/sim/m32c/gdb-if.c b/sim/m32c/gdb-if.c index 92e447f17faa..9ced5b9cad38 100644 --- a/sim/m32c/gdb-if.c +++ b/sim/m32c/gdb-if.c @@ -27,6 +27,7 @@ along with this program. If not, see . */ #include #include "ansidecl.h" +#include "libiberty.h" #include "gdb/callback.h" #include "gdb/remote-sim.h" #include "gdb/signals.h" @@ -648,37 +649,24 @@ sim_stop_reason (SIM_DESC sd, enum sim_stop *reason_p, int *sigrc_p) void sim_do_command (SIM_DESC sd, const char *cmd) { - const char *args; - char *p = strdup (cmd); + const char *arg; + char **argv = buildargv (cmd); check_desc (sd); - /* Skip leading whitespace. */ - while (isspace (*p)) - p++; - - /* Find the extent of the command word. */ - for (p = cmd; *p; p++) - if (isspace (*p)) - break; - - /* Null-terminate the command word, and record the start of any - further arguments. */ - if (*p) + if (argv != NULL) { - *p = '\0'; - args = p + 1; - while (isspace (*args)) - args++; + cmd = argv[0]; + arg = argv[1]; } else - args = p; + cmd = arg = ""; if (strcmp (cmd, "trace") == 0) { - if (strcmp (args, "on") == 0) + if (strcmp (arg, "on") == 0) trace = 1; - else if (strcmp (args, "off") == 0) + else if (strcmp (arg, "off") == 0) trace = 0; else printf ("The 'sim trace' command expects 'on' or 'off' " @@ -686,9 +674,9 @@ sim_do_command (SIM_DESC sd, const char *cmd) } else if (strcmp (cmd, "verbose") == 0) { - if (strcmp (args, "on") == 0) + if (strcmp (arg, "on") == 0) verbose = 1; - else if (strcmp (args, "off") == 0) + else if (strcmp (arg, "off") == 0) verbose = 0; else printf ("The 'sim verbose' command expects 'on' or 'off'" @@ -698,7 +686,7 @@ sim_do_command (SIM_DESC sd, const char *cmd) printf ("The 'sim' command expects either 'trace' or 'verbose'" " as a subcommand.\n"); - free (p); + freeargv (argv); } char ** diff --git a/sim/rl78/gdb-if.c b/sim/rl78/gdb-if.c index 7119214113be..280c290a74ce 100644 --- a/sim/rl78/gdb-if.c +++ b/sim/rl78/gdb-if.c @@ -27,6 +27,7 @@ along with this program. If not, see . */ #include #include "ansidecl.h" +#include "libiberty.h" #include "gdb/callback.h" #include "gdb/remote-sim.h" #include "gdb/signals.h" @@ -533,40 +534,24 @@ sim_stop_reason (SIM_DESC sd, enum sim_stop *reason_p, int *sigrc_p) void sim_do_command (SIM_DESC sd, const char *cmd) { - const char *args; - char *p = strdup (cmd); + const char *arg; + char **argv = buildargv (cmd); check_desc (sd); - if (cmd == NULL) + if (argv != NULL) { - cmd = ""; - args = ""; + cmd = argv[0]; + arg = argv[1]; } else - { - /* Skip leading whitespace. */ - while (isspace (*p)) - p++; - - /* Null-terminate the command word, and record the start of any - further arguments. */ - if (*p) - { - *p = '\0'; - args = p + 1; - while (isspace (*args)) - args++; - } - else - args = p; - } + cmd = arg = ""; if (strcmp (cmd, "trace") == 0) { - if (strcmp (args, "on") == 0) + if (strcmp (arg, "on") == 0) trace = 1; - else if (strcmp (args, "off") == 0) + else if (strcmp (arg, "off") == 0) trace = 0; else printf ("The 'sim trace' command expects 'on' or 'off' " @@ -574,11 +559,11 @@ sim_do_command (SIM_DESC sd, const char *cmd) } else if (strcmp (cmd, "verbose") == 0) { - if (strcmp (args, "on") == 0) + if (strcmp (arg, "on") == 0) verbose = 1; - else if (strcmp (args, "noisy") == 0) + else if (strcmp (arg, "noisy") == 0) verbose = 2; - else if (strcmp (args, "off") == 0) + else if (strcmp (arg, "off") == 0) verbose = 0; else printf ("The 'sim verbose' command expects 'on', 'noisy', or 'off'" @@ -588,7 +573,7 @@ sim_do_command (SIM_DESC sd, const char *cmd) printf ("The 'sim' command expects either 'trace' or 'verbose'" " as a subcommand.\n"); - free (p); + freeargv (argv); } /* Stub for command completion. */ diff --git a/sim/rx/gdb-if.c b/sim/rx/gdb-if.c index 3d052e62baa2..ce2b9a0a4918 100644 --- a/sim/rx/gdb-if.c +++ b/sim/rx/gdb-if.c @@ -27,6 +27,7 @@ along with this program. If not, see . */ #include #include "ansidecl.h" +#include "libiberty.h" #include "gdb/callback.h" #include "gdb/remote-sim.h" #include "gdb/signals.h" @@ -794,37 +795,24 @@ sim_stop_reason (SIM_DESC sd, enum sim_stop *reason_p, int *sigrc_p) void sim_do_command (SIM_DESC sd, const char *cmd) { - const char *args; - char *p = strdup (cmd); + const char *arg; + char **argv = buildargv (cmd); check_desc (sd); - /* Skip leading whitespace. */ - while (isspace (*p)) - p++; - - /* Find the extent of the command word. */ - for (; *p != '\0'; p++) - if (isspace (*p)) - break; - - /* Null-terminate the command word, and record the start of any - further arguments. */ - if (*p != '\0') + if (argv != NULL) { - *p = '\0'; - args = p + 1; - while (isspace (*args)) - args++; + cmd = argv[0]; + arg = argv[1]; } else - args = p; + cmd = arg = ""; if (strcmp (cmd, "trace") == 0) { - if (strcmp (args, "on") == 0) + if (strcmp (arg, "on") == 0) trace = 1; - else if (strcmp (args, "off") == 0) + else if (strcmp (arg, "off") == 0) trace = 0; else printf ("The 'sim trace' command expects 'on' or 'off' " @@ -832,11 +820,11 @@ sim_do_command (SIM_DESC sd, const char *cmd) } else if (strcmp (cmd, "verbose") == 0) { - if (strcmp (args, "on") == 0) + if (strcmp (arg, "on") == 0) verbose = 1; - else if (strcmp (args, "noisy") == 0) + else if (strcmp (arg, "noisy") == 0) verbose = 2; - else if (strcmp (args, "off") == 0) + else if (strcmp (arg, "off") == 0) verbose = 0; else printf ("The 'sim verbose' command expects 'on', 'noisy', or 'off'" @@ -846,7 +834,7 @@ sim_do_command (SIM_DESC sd, const char *cmd) printf ("The 'sim' command expects either 'trace' or 'verbose'" " as a subcommand.\n"); - free (p); + freeargv (argv); } char ** -- 2.31.1