sim: m32c/rl78/rx: fix command parsing

Use buildargv to avoid writing to const memory and freeing invalid
pointers, and to avoid doing any string parsing ourselves.
This commit is contained in:
Mike Frysinger
2021-05-05 14:54:33 -04:00
parent 4467df35a9
commit 75070a4ede
6 changed files with 59 additions and 80 deletions

View File

@ -1,3 +1,8 @@
2021-05-05 Mike Frysinger <vapier@gentoo.org>
* gdb-if.c: Include libiberty.h.
(sim_do_command): Rewrite to use buildargv.
2021-05-04 Mike Frysinger <vapier@gentoo.org> 2021-05-04 Mike Frysinger <vapier@gentoo.org>
* configure: Regenerate. * configure: Regenerate.

View File

@ -27,6 +27,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include <ctype.h> #include <ctype.h>
#include "ansidecl.h" #include "ansidecl.h"
#include "libiberty.h"
#include "gdb/callback.h" #include "gdb/callback.h"
#include "gdb/remote-sim.h" #include "gdb/remote-sim.h"
#include "gdb/signals.h" #include "gdb/signals.h"
@ -648,37 +649,25 @@ sim_stop_reason (SIM_DESC sd, enum sim_stop *reason_p, int *sigrc_p)
void void
sim_do_command (SIM_DESC sd, const char *cmd) sim_do_command (SIM_DESC sd, const char *cmd)
{ {
const char *args; const char *arg;
char *p = strdup (cmd); char **argv = buildargv (cmd);
check_desc (sd); check_desc (sd);
/* Skip leading whitespace. */ cmd = arg = "";
while (isspace (*p)) if (argv != NULL)
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)
{ {
*p = '\0'; if (argv[0] != NULL)
args = p + 1; cmd = argv[0];
while (isspace (*args)) if (argv[1] != NULL)
args++; arg = argv[1];
} }
else
args = p;
if (strcmp (cmd, "trace") == 0) if (strcmp (cmd, "trace") == 0)
{ {
if (strcmp (args, "on") == 0) if (strcmp (arg, "on") == 0)
trace = 1; trace = 1;
else if (strcmp (args, "off") == 0) else if (strcmp (arg, "off") == 0)
trace = 0; trace = 0;
else else
printf ("The 'sim trace' command expects 'on' or 'off' " printf ("The 'sim trace' command expects 'on' or 'off' "
@ -686,9 +675,9 @@ sim_do_command (SIM_DESC sd, const char *cmd)
} }
else if (strcmp (cmd, "verbose") == 0) else if (strcmp (cmd, "verbose") == 0)
{ {
if (strcmp (args, "on") == 0) if (strcmp (arg, "on") == 0)
verbose = 1; verbose = 1;
else if (strcmp (args, "off") == 0) else if (strcmp (arg, "off") == 0)
verbose = 0; verbose = 0;
else else
printf ("The 'sim verbose' command expects 'on' or 'off'" printf ("The 'sim verbose' command expects 'on' or 'off'"
@ -698,7 +687,7 @@ sim_do_command (SIM_DESC sd, const char *cmd)
printf ("The 'sim' command expects either 'trace' or 'verbose'" printf ("The 'sim' command expects either 'trace' or 'verbose'"
" as a subcommand.\n"); " as a subcommand.\n");
free (p); freeargv (argv);
} }
char ** char **

View File

@ -1,3 +1,8 @@
2021-05-05 Mike Frysinger <vapier@gentoo.org>
* gdb-if.c: Include libiberty.h.
(sim_do_command): Rewrite to use buildargv.
2021-05-04 Mike Frysinger <vapier@gentoo.org> 2021-05-04 Mike Frysinger <vapier@gentoo.org>
* cpu.c (trace_register_init): Add missing (void). * cpu.c (trace_register_init): Add missing (void).

View File

@ -27,6 +27,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include <stdlib.h> #include <stdlib.h>
#include "ansidecl.h" #include "ansidecl.h"
#include "libiberty.h"
#include "gdb/callback.h" #include "gdb/callback.h"
#include "gdb/remote-sim.h" #include "gdb/remote-sim.h"
#include "gdb/signals.h" #include "gdb/signals.h"
@ -533,40 +534,25 @@ sim_stop_reason (SIM_DESC sd, enum sim_stop *reason_p, int *sigrc_p)
void void
sim_do_command (SIM_DESC sd, const char *cmd) sim_do_command (SIM_DESC sd, const char *cmd)
{ {
const char *args; const char *arg;
char *p = strdup (cmd); char **argv = buildargv (cmd);
check_desc (sd); check_desc (sd);
if (cmd == NULL) cmd = arg = "";
if (argv != NULL)
{ {
cmd = ""; if (argv[0] != NULL)
args = ""; cmd = argv[0];
} if (argv[1] != NULL)
else arg = argv[1];
{
/* 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;
} }
if (strcmp (cmd, "trace") == 0) if (strcmp (cmd, "trace") == 0)
{ {
if (strcmp (args, "on") == 0) if (strcmp (arg, "on") == 0)
trace = 1; trace = 1;
else if (strcmp (args, "off") == 0) else if (strcmp (arg, "off") == 0)
trace = 0; trace = 0;
else else
printf ("The 'sim trace' command expects 'on' or 'off' " printf ("The 'sim trace' command expects 'on' or 'off' "
@ -574,11 +560,11 @@ sim_do_command (SIM_DESC sd, const char *cmd)
} }
else if (strcmp (cmd, "verbose") == 0) else if (strcmp (cmd, "verbose") == 0)
{ {
if (strcmp (args, "on") == 0) if (strcmp (arg, "on") == 0)
verbose = 1; verbose = 1;
else if (strcmp (args, "noisy") == 0) else if (strcmp (arg, "noisy") == 0)
verbose = 2; verbose = 2;
else if (strcmp (args, "off") == 0) else if (strcmp (arg, "off") == 0)
verbose = 0; verbose = 0;
else else
printf ("The 'sim verbose' command expects 'on', 'noisy', or 'off'" printf ("The 'sim verbose' command expects 'on', 'noisy', or 'off'"
@ -588,7 +574,7 @@ sim_do_command (SIM_DESC sd, const char *cmd)
printf ("The 'sim' command expects either 'trace' or 'verbose'" printf ("The 'sim' command expects either 'trace' or 'verbose'"
" as a subcommand.\n"); " as a subcommand.\n");
free (p); freeargv (argv);
} }
/* Stub for command completion. */ /* Stub for command completion. */

View File

@ -1,3 +1,8 @@
2021-05-05 Mike Frysinger <vapier@gentoo.org>
* gdb-if.c: Include libiberty.h.
(sim_do_command): Rewrite to use buildargv.
2021-05-04 Mike Frysinger <vapier@gentoo.org> 2021-05-04 Mike Frysinger <vapier@gentoo.org>
* configure: Regenerate. * configure: Regenerate.

View File

@ -27,6 +27,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include <stdlib.h> #include <stdlib.h>
#include "ansidecl.h" #include "ansidecl.h"
#include "libiberty.h"
#include "gdb/callback.h" #include "gdb/callback.h"
#include "gdb/remote-sim.h" #include "gdb/remote-sim.h"
#include "gdb/signals.h" #include "gdb/signals.h"
@ -794,37 +795,25 @@ sim_stop_reason (SIM_DESC sd, enum sim_stop *reason_p, int *sigrc_p)
void void
sim_do_command (SIM_DESC sd, const char *cmd) sim_do_command (SIM_DESC sd, const char *cmd)
{ {
const char *args; const char *arg;
char *p = strdup (cmd); char **argv = buildargv (cmd);
check_desc (sd); check_desc (sd);
/* Skip leading whitespace. */ cmd = arg = "";
while (isspace (*p)) if (argv != NULL)
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')
{ {
*p = '\0'; if (argv[0] != NULL)
args = p + 1; cmd = argv[0];
while (isspace (*args)) if (argv[1] != NULL)
args++; arg = argv[1];
} }
else
args = p;
if (strcmp (cmd, "trace") == 0) if (strcmp (cmd, "trace") == 0)
{ {
if (strcmp (args, "on") == 0) if (strcmp (arg, "on") == 0)
trace = 1; trace = 1;
else if (strcmp (args, "off") == 0) else if (strcmp (arg, "off") == 0)
trace = 0; trace = 0;
else else
printf ("The 'sim trace' command expects 'on' or 'off' " printf ("The 'sim trace' command expects 'on' or 'off' "
@ -832,11 +821,11 @@ sim_do_command (SIM_DESC sd, const char *cmd)
} }
else if (strcmp (cmd, "verbose") == 0) else if (strcmp (cmd, "verbose") == 0)
{ {
if (strcmp (args, "on") == 0) if (strcmp (arg, "on") == 0)
verbose = 1; verbose = 1;
else if (strcmp (args, "noisy") == 0) else if (strcmp (arg, "noisy") == 0)
verbose = 2; verbose = 2;
else if (strcmp (args, "off") == 0) else if (strcmp (arg, "off") == 0)
verbose = 0; verbose = 0;
else else
printf ("The 'sim verbose' command expects 'on', 'noisy', or 'off'" printf ("The 'sim verbose' command expects 'on', 'noisy', or 'off'"
@ -846,7 +835,7 @@ sim_do_command (SIM_DESC sd, const char *cmd)
printf ("The 'sim' command expects either 'trace' or 'verbose'" printf ("The 'sim' command expects either 'trace' or 'verbose'"
" as a subcommand.\n"); " as a subcommand.\n");
free (p); freeargv (argv);
} }
char ** char **