summaryrefslogtreecommitdiff
path: root/sim/common
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2021-11-15 03:32:26 -0500
committerMike Frysinger <vapier@gentoo.org>2021-11-15 03:32:26 -0500
commit7770da971420cd3327326b6b8720383d23b5dbd3 (patch)
treed27d8a7c92f3cbb05629357f6dee87db148c260b /sim/common
parent145a603abc767c2a1e6fe7755c10686353bbcc8f (diff)
sim: run: fix crash in argc==0 error situation
The new argv processing code assumed that we were always passed a command line. If we weren't, make sure we don't crash before we get a chance to output an error message about incorrect usage.
Diffstat (limited to 'sim/common')
-rw-r--r--sim/common/sim-options.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/sim/common/sim-options.c b/sim/common/sim-options.c
index ee7d11fb69..17e550e555 100644
--- a/sim/common/sim-options.c
+++ b/sim/common/sim-options.c
@@ -615,16 +615,26 @@ sim_parse_args (SIM_DESC sd, char * const *argv)
{
if (STATE_OPEN_KIND (sd) == SIM_OPEN_STANDALONE)
{
- char **new_argv = dupargv (argv + optind);
+ char **new_argv;
- STATE_PROG_FILE (sd) = xstrdup (argv[optind]);
- if (STATE_PROG_ARGV0 (sd) != NULL)
- {
- free (new_argv[0]);
- new_argv[0] = xstrdup (STATE_PROG_ARGV0 (sd));
- }
+ free (STATE_PROG_FILE (sd));
+ STATE_PROG_FILE (sd) = NULL;
+
+ new_argv = dupargv (argv + optind);
freeargv (STATE_PROG_ARGV (sd));
STATE_PROG_ARGV (sd) = new_argv;
+
+ /* Skip steps when argc == 0. */
+ if (argv[optind] != NULL)
+ {
+ STATE_PROG_FILE (sd) = xstrdup (argv[optind]);
+
+ if (STATE_PROG_ARGV0 (sd) != NULL)
+ {
+ free (new_argv[0]);
+ new_argv[0] = xstrdup (STATE_PROG_ARGV0 (sd));
+ }
+ }
}
break;
}