[PATCH v2] sim: m32c/rl78/rx: fix command parsing

Mike Frysinger via Gdb-patches
2021-05-05T23:03:19Z

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 <http://www.gnu.org/licenses/>. */
#include <ctype.h>

#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 <http://www.gnu.org/licenses/>. */
#include <stdlib.h>

#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 <http://www.gnu.org/licenses/>. */
#include <stdlib.h>

#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