SCP: Fix SHOW command parsing to properly valiidate argument cases

As originally reported in #758
This commit is contained in:
Mark Pizzolato 2019-10-26 06:40:16 -07:00
parent 08714aff2b
commit af58efe67a

44
scp.c
View file

@ -3125,7 +3125,7 @@ if (dptr->modifiers) {
if ((!mptr->disp) || (!mptr->pstring) || !(*mptr->pstring))
continue;
fprint_header (st, &found, header);
sprintf (buf, "show %s %s%s", sim_dname (dptr), mptr->pstring, MODMASK(mptr,MTAB_SHP) ? "=arg" : "");
sprintf (buf, "show %s %s%s", sim_dname (dptr), mptr->pstring, MODMASK(mptr,MTAB_SHP) ? "{=arg}" : "");
fprintf (st, "%-30s\t%s\n", buf, mptr->help ? mptr->help : "");
}
}
@ -5310,11 +5310,6 @@ while (*cptr != 0) { /* do all mods */
}
else if (!mptr->desc) /* value desc? */
break;
// else if (mptr->mask & MTAB_VAL) { /* take a value? */
// if (!cvptr) return SCPE_MISVAL; /* none? error */
// r = dep_reg (0, cvptr, (REG *) mptr->desc, 0);
// if (r != SCPE_OK) return r;
// }
else if (cvptr) /* = value? */
return SCPE_ARG;
else *((int32 *) mptr->desc) = mptr->match;
@ -5529,9 +5524,9 @@ if ((dptr = find_dev (gbuf))) { /* device match? */
}
else if ((dptr = find_unit (gbuf, &uptr))) { /* unit match? */
if (uptr == NULL) /* invalid unit */
return SCPE_NXUN;
return sim_messagef (SCPE_NXUN, "Non-existent unit: %s\n", gbuf);
if (uptr->flags & UNIT_DIS) /* disabled? */
return SCPE_UDIS;
return sim_messagef (SCPE_UDIS, "Unit disabled: %s\n", gbuf);
shtb = show_unit_tab; /* global table */
lvl = MTAB_VUN; /* unit match */
GET_SWITCHES (cptr); /* get more switches */
@ -5544,7 +5539,7 @@ else {
if (sim_dflt_dev->modifiers) {
if ((cvptr = strchr (gbuf, '='))) /* = value? */
*cvptr++ = 0;
for (mptr = sim_dflt_dev->modifiers; mptr->mask != 0; mptr++) {
for (mptr = sim_dflt_dev->modifiers; mptr && (mptr->mask != 0); mptr++) {
if ((((mptr->mask & MTAB_VDV) == MTAB_VDV) &&
(mptr->pstring && (MATCH_CMD (gbuf, mptr->pstring) == 0))) ||
(!(mptr->mask & MTAB_VDV) && (mptr->mstring && (MATCH_CMD (gbuf, mptr->mstring) == 0)))) {
@ -5561,7 +5556,7 @@ else {
if ((shptr = find_shtab (show_dev_tab, gbuf))) /* global match? */
return shptr->action (ofile, sim_dflt_dev, uptr, shptr->arg, cptr);
else
return SCPE_NXDEV; /* no match */
return sim_messagef (SCPE_NXDEV, "Non-existent device: %s\n", gbuf);/* no match */
}
}
@ -5581,13 +5576,9 @@ while (*cptr != 0) { /* do all mods */
((mptr->mask & lvl) == lvl): (MTAB_VUN & lvl)) &&
((mptr->disp && mptr->pstring && /* named disp? */
(MATCH_CMD (gbuf, mptr->pstring) == 0))
// ||
// ((mptr->mask & MTAB_VAL) && /* named value? */
// mptr->mstring &&
// (MATCH_CMD (gbuf, mptr->mstring) == 0)))
)) {
if (cvptr && !(mptr->mask & MTAB_SHP))
return SCPE_ARG;
if (cvptr && !MODMASK(mptr,MTAB_SHP))
return sim_messagef (SCPE_ARG, "Invalid Argument: %s=%s\n", gbuf, cvptr);
show_one_mod (ofile, dptr, uptr, mptr, cvptr, 1);
break;
} /* end if */
@ -5600,10 +5591,12 @@ while (*cptr != 0) { /* do all mods */
if (r != SCPE_OK)
return r;
}
else if (!dptr->modifiers) /* no modifiers? */
return SCPE_NOPARAM;
else
return SCPE_NXPAR;
else {
if (!dptr->modifiers) /* no modifiers? */
return sim_messagef (SCPE_NOPARAM, "%s device has no parameters\n", dptr->name);
else
return sim_messagef (SCPE_NXPAR, "Non-existent parameter: %s\n", gbuf);
}
} /* end if */
} /* end while */
return SCPE_OK;
@ -6255,18 +6248,11 @@ t_stat show_one_mod (FILE *st, DEVICE *dptr, UNIT *uptr, MTAB *mptr,
CONST char *cptr, int32 flag)
{
t_stat r = SCPE_OK;
//t_value val;
if (mptr->disp)
r = mptr->disp (st, uptr, mptr->match, (CONST void *)(cptr? cptr: mptr->desc));
//else if ((mptr->mask & MTAB_XTD) && (mptr->mask & MTAB_VAL)) {
// REG *rptr = (REG *) mptr->desc;
// fprintf (st, "%s=", mptr->pstring);
// val = get_rval (rptr, 0);
// fprint_val (st, val, rptr->radix, rptr->width,
// rptr->flags & REG_FMT);
// }
else fputs (mptr->pstring, st);
else
fputs (mptr->pstring, st);
if ((r == SCPE_OK) && (flag && !((mptr->mask & MTAB_XTD) && MODMASK(mptr,MTAB_NMO))))
fputc ('\n', st);
return r;