SCP: Coverity fixes

This commit is contained in:
Mark Pizzolato 2022-03-09 15:53:10 -08:00
parent a1a916f819
commit e3dbe93e35

76
scp.c
View file

@ -2911,32 +2911,34 @@ if (cptr == NULL) {
else else
cptr2 = NULL; cptr2 = NULL;
docmdp = find_cmd ("DO"); docmdp = find_cmd ("DO");
if (docmdp && cptr && (sizeof (nbuf) > strlen (cptr) + strlen ("/simh.ini") + 3)) { if (docmdp) {
snprintf(nbuf, sizeof (nbuf), "\"%s%s%ssimh.ini\"", cptr2 ? cptr2 : "", cptr, strchr (cptr, '/') ? "/" : "\\"); if (cptr && (sizeof (nbuf) > strlen (cptr) + strlen ("/simh.ini") + 3)) {
stat = docmdp->action (-1, nbuf); /* simh.ini proc cmd file */ snprintf(nbuf, sizeof (nbuf), "\"%s%s%ssimh.ini\"", cptr2 ? cptr2 : "", cptr, strchr (cptr, '/') ? "/" : "\\");
} stat = docmdp->action (-1, nbuf); /* simh.ini proc cmd file */
if (SCPE_BARE_STATUS(stat) == SCPE_OPENERR) }
stat = docmdp->action (-1, "simh.ini"); /* simh.ini proc cmd file */ if (SCPE_BARE_STATUS(stat) == SCPE_OPENERR)
if (*cbuf) /* cmd file arg? */ stat = docmdp->action (-1, "simh.ini"); /* simh.ini proc cmd file */
stat = docmdp->action (0, cbuf); /* proc cmd file */ if (*cbuf) /* cmd file arg? */
else { stat = docmdp->action (0, cbuf); /* proc cmd file */
if (*argv[0]) { /* sim name arg? */ else {
char *np; /* "path.ini" */ if (*argv[0]) { /* sim name arg? */
nbuf[0] = '"'; /* starting " */ char *np; /* "path.ini" */
strlcpy (nbuf + 1, argv[0], PATH_MAX + 2); /* copy sim name */ nbuf[0] = '"'; /* starting " */
if ((np = (char *)match_ext (nbuf, "EXE"))) /* remove .exe */ strlcpy (nbuf + 1, argv[0], PATH_MAX + 2); /* copy sim name */
*np = 0; if ((np = (char *)match_ext (nbuf, "EXE"))) /* remove .exe */
strlcat (nbuf, ".ini\"", sizeof (nbuf)); /* add .ini" */ *np = 0;
stat = docmdp->action (-1, nbuf) & ~SCPE_NOMESSAGE; /* proc default cmd file */ strlcat (nbuf, ".ini\"", sizeof (nbuf)); /* add .ini" */
if (stat == SCPE_OPENERR) { /* didn't exist/can't open? */ stat = docmdp->action (-1, nbuf) & ~SCPE_NOMESSAGE; /* proc default cmd file */
np = strrchr (nbuf, '/'); /* stript path and try again in cwd */ if (stat == SCPE_OPENERR) { /* didn't exist/can't open? */
if (np == NULL) np = strrchr (nbuf, '/'); /* stript path and try again in cwd */
np = strrchr (nbuf, '\\'); /* windows path separator */ if (np == NULL)
if (np == NULL) np = strrchr (nbuf, '\\'); /* windows path separator */
np = strrchr (nbuf, ']'); /* VMS path separator */ if (np == NULL)
if (np != NULL) { np = strrchr (nbuf, ']'); /* VMS path separator */
*np = '"'; if (np != NULL) {
stat = docmdp->action (-1, np) & ~SCPE_NOMESSAGE;/* proc default cmd file */ *np = '"';
stat = docmdp->action (-1, np) & ~SCPE_NOMESSAGE;/* proc default cmd file */
}
} }
} }
} }
@ -4301,24 +4303,26 @@ t_stat sim_call_argv (int (*main_like_routine)(int argc, char *argv[]), const ch
{ {
int argc = 1; int argc = 1;
char **argv = (char **)calloc ((1 + argc), sizeof (*argv)); char **argv = (char **)calloc ((1 + argc), sizeof (*argv));
size_t cptr_len = strlen (cptr); size_t arg_size;
char *argline = (char *)malloc (2 + 2 * cptr_len); char *argline = NULL;
char *cp, quote; char *cp, quote;
t_stat result = SCPE_OK; t_stat result = SCPE_OK;
if ((argv == NULL) || (argline == NULL)) {
free (argv);
free (argline);
return SCPE_MEM;
}
if (cptr == NULL) { if (cptr == NULL) {
free (argv); free (argv);
free (argline); free (argline);
return SCPE_ARG; return SCPE_ARG;
} }
strcpy (argline, cptr); arg_size = 2 + (2 * strlen (cptr));
cp = argline + cptr_len + 1; argline = (char *)malloc (arg_size);
strcpy (cp, cptr); if ((argv == NULL) || (argline == NULL)) {
free (argv);
free (argline);
return SCPE_MEM;
}
strlcpy (argline, cptr, arg_size);
cp = argline + (arg_size / 2);
strlcpy (cp, cptr, arg_size / 2);
argv[0] = argline; /* argv[0] points to unparsed arguments */ argv[0] = argline; /* argv[0] points to unparsed arguments */
argv[argc + 1] = NULL; /* make sure the argument list always ends with a NULL */ argv[argc + 1] = NULL; /* make sure the argument list always ends with a NULL */
while (*cp) { while (*cp) {