SCP: Fix SHOW command parsing to properly valiidate argument cases
As originally reported in #758
This commit is contained in:
parent
08714aff2b
commit
af58efe67a
1 changed files with 15 additions and 29 deletions
44
scp.c
44
scp.c
|
@ -3125,7 +3125,7 @@ if (dptr->modifiers) {
|
||||||
if ((!mptr->disp) || (!mptr->pstring) || !(*mptr->pstring))
|
if ((!mptr->disp) || (!mptr->pstring) || !(*mptr->pstring))
|
||||||
continue;
|
continue;
|
||||||
fprint_header (st, &found, header);
|
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 : "");
|
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? */
|
else if (!mptr->desc) /* value desc? */
|
||||||
break;
|
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? */
|
else if (cvptr) /* = value? */
|
||||||
return SCPE_ARG;
|
return SCPE_ARG;
|
||||||
else *((int32 *) mptr->desc) = mptr->match;
|
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? */
|
else if ((dptr = find_unit (gbuf, &uptr))) { /* unit match? */
|
||||||
if (uptr == NULL) /* invalid unit */
|
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? */
|
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 */
|
shtb = show_unit_tab; /* global table */
|
||||||
lvl = MTAB_VUN; /* unit match */
|
lvl = MTAB_VUN; /* unit match */
|
||||||
GET_SWITCHES (cptr); /* get more switches */
|
GET_SWITCHES (cptr); /* get more switches */
|
||||||
|
@ -5544,7 +5539,7 @@ else {
|
||||||
if (sim_dflt_dev->modifiers) {
|
if (sim_dflt_dev->modifiers) {
|
||||||
if ((cvptr = strchr (gbuf, '='))) /* = value? */
|
if ((cvptr = strchr (gbuf, '='))) /* = value? */
|
||||||
*cvptr++ = 0;
|
*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) &&
|
if ((((mptr->mask & MTAB_VDV) == MTAB_VDV) &&
|
||||||
(mptr->pstring && (MATCH_CMD (gbuf, mptr->pstring) == 0))) ||
|
(mptr->pstring && (MATCH_CMD (gbuf, mptr->pstring) == 0))) ||
|
||||||
(!(mptr->mask & MTAB_VDV) && (mptr->mstring && (MATCH_CMD (gbuf, mptr->mstring) == 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? */
|
if ((shptr = find_shtab (show_dev_tab, gbuf))) /* global match? */
|
||||||
return shptr->action (ofile, sim_dflt_dev, uptr, shptr->arg, cptr);
|
return shptr->action (ofile, sim_dflt_dev, uptr, shptr->arg, cptr);
|
||||||
else
|
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->mask & lvl) == lvl): (MTAB_VUN & lvl)) &&
|
||||||
((mptr->disp && mptr->pstring && /* named disp? */
|
((mptr->disp && mptr->pstring && /* named disp? */
|
||||||
(MATCH_CMD (gbuf, mptr->pstring) == 0))
|
(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))
|
if (cvptr && !MODMASK(mptr,MTAB_SHP))
|
||||||
return SCPE_ARG;
|
return sim_messagef (SCPE_ARG, "Invalid Argument: %s=%s\n", gbuf, cvptr);
|
||||||
show_one_mod (ofile, dptr, uptr, mptr, cvptr, 1);
|
show_one_mod (ofile, dptr, uptr, mptr, cvptr, 1);
|
||||||
break;
|
break;
|
||||||
} /* end if */
|
} /* end if */
|
||||||
|
@ -5600,10 +5591,12 @@ while (*cptr != 0) { /* do all mods */
|
||||||
if (r != SCPE_OK)
|
if (r != SCPE_OK)
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
else if (!dptr->modifiers) /* no modifiers? */
|
else {
|
||||||
return SCPE_NOPARAM;
|
if (!dptr->modifiers) /* no modifiers? */
|
||||||
else
|
return sim_messagef (SCPE_NOPARAM, "%s device has no parameters\n", dptr->name);
|
||||||
return SCPE_NXPAR;
|
else
|
||||||
|
return sim_messagef (SCPE_NXPAR, "Non-existent parameter: %s\n", gbuf);
|
||||||
|
}
|
||||||
} /* end if */
|
} /* end if */
|
||||||
} /* end while */
|
} /* end while */
|
||||||
return SCPE_OK;
|
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)
|
CONST char *cptr, int32 flag)
|
||||||
{
|
{
|
||||||
t_stat r = SCPE_OK;
|
t_stat r = SCPE_OK;
|
||||||
//t_value val;
|
|
||||||
|
|
||||||
if (mptr->disp)
|
if (mptr->disp)
|
||||||
r = mptr->disp (st, uptr, mptr->match, (CONST void *)(cptr? cptr: mptr->desc));
|
r = mptr->disp (st, uptr, mptr->match, (CONST void *)(cptr? cptr: mptr->desc));
|
||||||
//else if ((mptr->mask & MTAB_XTD) && (mptr->mask & MTAB_VAL)) {
|
else
|
||||||
// REG *rptr = (REG *) mptr->desc;
|
fputs (mptr->pstring, st);
|
||||||
// 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);
|
|
||||||
if ((r == SCPE_OK) && (flag && !((mptr->mask & MTAB_XTD) && MODMASK(mptr,MTAB_NMO))))
|
if ((r == SCPE_OK) && (flag && !((mptr->mask & MTAB_XTD) && MODMASK(mptr,MTAB_NMO))))
|
||||||
fputc ('\n', st);
|
fputc ('\n', st);
|
||||||
return r;
|
return r;
|
||||||
|
|
Loading…
Add table
Reference in a new issue