mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-22 19:09:31 +08:00
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:
@ -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.
|
||||||
|
@ -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 **
|
||||||
|
@ -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).
|
||||||
|
@ -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. */
|
||||||
|
@ -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.
|
||||||
|
@ -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 **
|
||||||
|
Reference in New Issue
Block a user