From af58efe67aee871131039955de99989b3f2da3b6 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Sat, 26 Oct 2019 06:40:16 -0700 Subject: [PATCH] SCP: Fix SHOW command parsing to properly valiidate argument cases As originally reported in #758 --- scp.c | 44 +++++++++++++++----------------------------- 1 file changed, 15 insertions(+), 29 deletions(-) diff --git a/scp.c b/scp.c index f3f73416..d90f963c 100644 --- a/scp.c +++ b/scp.c @@ -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;