From 17abb1223abc6633bfa8802905d1d62599b9f5f2 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Thu, 20 Oct 2016 13:32:51 -0700 Subject: [PATCH] TAPE: Make sure that all tape library APIs only work after sim_tape_attach - Detects and fixes the problem reported in #345 --- doc/simh.doc | Bin 236544 -> 233984 bytes sim_tape.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/doc/simh.doc b/doc/simh.doc index a932ecc9aa922928e2ecb9c631568017b977cd17..4eaac45a1665e15c3be217f63d68daa73679219b 100644 GIT binary patch delta 11629 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 \ \ +if (ctx == NULL) \ + return sim_messagef (SCPE_IERR, "Bad Attach\n"); \ if ((!callback) || !ctx->asynch_io) #define AIO_CALL(op, _buf, _bc, _fc, _max, _vbc, _gaplen, _bpi, _obj, _callback)\ @@ -348,7 +350,9 @@ if (ctx) { } } #else -#define AIO_CALLSETUP +#define AIO_CALLSETUP \ + if (uptr->tape_ctx == NULL) \ + return sim_messagef (SCPE_IERR, "Bad Attach\n"); #define AIO_CALL(op, _buf, _fc, _bc, _max, _vbc, _gaplen, _bpi, _obj, _callback) \ if (_callback) \ (_callback) (uptr, r); @@ -522,7 +526,7 @@ uint32 f = MT_GET_FMT (uptr); t_stat r; t_bool auto_format = FALSE; -if ((uptr == NULL) || !(uptr->flags & UNIT_ATT)) +if ((ctx == NULL) || (uptr == NULL) || !(uptr->flags & UNIT_ATT)) return SCPE_IERR; if (uptr->io_flush) @@ -586,6 +590,8 @@ static void sim_tape_data_trace(UNIT *uptr, const uint8 *data, size_t len, const { struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; +if (ctx == NULL) + return; if (sim_deb && (ctx->dptr->dctrl & reason)) sim_data_trace(ctx->dptr, uptr, (detail ? data : NULL), "", len, txt, reason); } @@ -692,6 +698,8 @@ MT_CLR_PNU (uptr); /* clear the position-no if ((uptr->flags & UNIT_ATT) == 0) /* if the unit is not attached */ return MTSE_UNATT; /* then quit with an error */ +if (ctx == NULL) /* if not properly attached? */ + return sim_messagef (SCPE_IERR, "Bad Attach\n"); /* that's a problem */ sim_fseek (uptr->fileref, uptr->pos, SEEK_SET); /* set the initial tape position */ @@ -902,6 +910,8 @@ MT_CLR_PNU (uptr); /* clear the position-no if ((uptr->flags & UNIT_ATT) == 0) /* if the unit is not attached */ return MTSE_UNATT; /* then quit with an error */ +if (ctx == NULL) /* if not properly attached? */ + return sim_messagef (SCPE_IERR, "Bad Attach\n"); /* that's a problem */ if (sim_tape_bot (uptr)) /* if the unit is positioned at the BOT */ return MTSE_BOT; /* then reading backward is not possible */ @@ -1065,6 +1075,8 @@ t_mtrlnt i, tbc, rbc; t_addr opos; t_stat st; +if (ctx == NULL) /* if not properly attached? */ + return sim_messagef (SCPE_IERR, "Bad Attach\n"); /* that's a problem */ sim_debug (ctx->dbit, ctx->dptr, "sim_tape_rdrecf(unit=%d, buf=%p, max=%d)\n", (int)(uptr-ctx->dptr->units), buf, max); opos = uptr->pos; /* old position */ @@ -1129,6 +1141,8 @@ uint32 f = MT_GET_FMT (uptr); t_mtrlnt i, rbc, tbc; t_stat st; +if (ctx == NULL) /* if not properly attached? */ + return sim_messagef (SCPE_IERR, "Bad Attach\n"); /* that's a problem */ sim_debug (ctx->dbit, ctx->dptr, "sim_tape_rdrecr(unit=%d, buf=%p, max=%d)\n", (int)(uptr-ctx->dptr->units), buf, max); if (MTSE_OK != (st = sim_tape_rdlntr (uptr, &tbc))) /* read rec lnt */ @@ -1179,6 +1193,8 @@ struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; uint32 f = MT_GET_FMT (uptr); t_mtrlnt sbc; +if (ctx == NULL) /* if not properly attached? */ + return sim_messagef (SCPE_IERR, "Bad Attach\n"); /* that's a problem */ sim_debug (ctx->dbit, ctx->dptr, "sim_tape_wrrecf(unit=%d, buf=%p, bc=%d)\n", (int)(uptr-ctx->dptr->units), buf, bc); sim_tape_data_trace(uptr, buf, bc, "Record Write", ctx->dptr->dctrl & MTSE_DBG_DAT, MTSE_DBG_STR); @@ -1239,6 +1255,8 @@ struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; MT_CLR_PNU (uptr); if ((uptr->flags & UNIT_ATT) == 0) /* not attached? */ return MTSE_UNATT; +if (ctx == NULL) /* if not properly attached? */ + return sim_messagef (SCPE_IERR, "Bad Attach\n"); /* that's a problem */ if (sim_tape_wrp (uptr)) /* write prot? */ return MTSE_WRP; sim_fseek (uptr->fileref, uptr->pos, SEEK_SET); /* set pos */ @@ -1258,6 +1276,8 @@ t_stat sim_tape_wrtmk (UNIT *uptr) { struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; +if (ctx == NULL) /* if not properly attached? */ + return sim_messagef (SCPE_IERR, "Bad Attach\n"); /* that's a problem */ sim_debug (ctx->dbit, ctx->dptr, "sim_tape_wrtmk(unit=%d)\n", (int)(uptr-ctx->dptr->units)); if (MT_GET_FMT (uptr) == MTUF_F_P7B) { /* P7B? */ uint8 buf = P7B_EOF; /* eof mark */ @@ -1282,6 +1302,8 @@ t_stat sim_tape_wreom (UNIT *uptr) t_stat result; struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; +if (ctx == NULL) /* if not properly attached? */ + return sim_messagef (SCPE_IERR, "Bad Attach\n"); /* that's a problem */ sim_debug (ctx->dbit, ctx->dptr, "sim_tape_wreom(unit=%d)\n", (int)(uptr-ctx->dptr->units)); if (MT_GET_FMT (uptr) == MTUF_F_P7B) /* cant do P7B */ return MTSE_FMT; @@ -1310,6 +1332,8 @@ t_stat sim_tape_wreomrw (UNIT *uptr) struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; t_stat r; +if (ctx == NULL) /* if not properly attached? */ + return sim_messagef (SCPE_IERR, "Bad Attach\n"); /* that's a problem */ sim_debug (ctx->dbit, ctx->dptr, "sim_tape_wreomrw(unit=%d)\n", (int)(uptr-ctx->dptr->units)); if (MT_GET_FMT (uptr) == MTUF_F_P7B) /* cant do P7B */ return MTSE_FMT; @@ -1442,6 +1466,8 @@ const uint32 format = MT_GET_FMT (uptr); /* tape format */ const uint32 meta_size = sizeof (t_mtrlnt); /* bytes per metadatum */ const uint32 min_rec_size = 2 + sizeof (t_mtrlnt) * 2; /* smallest data record size */ +if (ctx == NULL) /* if not properly attached? */ + return sim_messagef (SCPE_IERR, "Bad Attach\n"); /* that's a problem */ sim_debug (ctx->dbit, ctx->dptr, "sim_tape_wrgap(unit=%d, gaplen=%u)\n", (int)(uptr-ctx->dptr->units), gaplen); MT_CLR_PNU (uptr); @@ -1609,6 +1635,8 @@ t_stat sim_tape_sprecf (UNIT *uptr, t_mtrlnt *bc) struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; t_stat st; +if (ctx == NULL) /* if not properly attached? */ + return sim_messagef (SCPE_IERR, "Bad Attach\n"); /* that's a problem */ sim_debug (ctx->dbit, ctx->dptr, "sim_tape_sprecf(unit=%d)\n", (int)(uptr-ctx->dptr->units)); st = sim_tape_rdlntf (uptr, bc); /* get record length */ @@ -1650,6 +1678,8 @@ struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; t_stat st; t_mtrlnt tbc; +if (ctx == NULL) /* if not properly attached? */ + return sim_messagef (SCPE_IERR, "Bad Attach\n"); /* that's a problem */ sim_debug (ctx->dbit, ctx->dptr, "sim_tape_sprecsf(unit=%d, count=%d)\n", (int)(uptr-ctx->dptr->units), count); *skipped = 0; @@ -1695,6 +1725,8 @@ t_stat sim_tape_sprecr (UNIT *uptr, t_mtrlnt *bc) struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; t_stat st; +if (ctx == NULL) /* if not properly attached? */ + return sim_messagef (SCPE_IERR, "Bad Attach\n"); /* that's a problem */ sim_debug (ctx->dbit, ctx->dptr, "sim_tape_sprecr(unit=%d)\n", (int)(uptr-ctx->dptr->units)); if (MT_TST_PNU (uptr)) { @@ -1742,6 +1774,8 @@ struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; t_stat st; t_mtrlnt tbc; +if (ctx == NULL) /* if not properly attached? */ + return sim_messagef (SCPE_IERR, "Bad Attach\n"); /* that's a problem */ sim_debug (ctx->dbit, ctx->dptr, "sim_tape_sprecsr(unit=%d, count=%d)\n", (int)(uptr-ctx->dptr->units), count); *skipped = 0; @@ -1791,6 +1825,8 @@ t_stat st; t_bool last_tapemark = FALSE; uint32 filerecsskipped; +if (ctx == NULL) /* if not properly attached? */ + return sim_messagef (SCPE_IERR, "Bad Attach\n"); /* that's a problem */ sim_debug (ctx->dbit, ctx->dptr, "sim_tape_spfilebyrecf(unit=%d, count=%d, check_leot=%d)\n", (int)(uptr-ctx->dptr->units), count, check_leot); if (check_leot) { @@ -1859,6 +1895,8 @@ t_stat sim_tape_spfilef (UNIT *uptr, uint32 count, uint32 *skipped) struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; uint32 totalrecsskipped; +if (ctx == NULL) /* if not properly attached? */ + return sim_messagef (SCPE_IERR, "Bad Attach\n"); /* that's a problem */ sim_debug (ctx->dbit, ctx->dptr, "sim_tape_spfilef(unit=%d, count=%d)\n", (int)(uptr-ctx->dptr->units), count); return sim_tape_spfilebyrecf (uptr, count, skipped, &totalrecsskipped, FALSE); @@ -1900,6 +1938,8 @@ struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; t_stat st; uint32 filerecsskipped; +if (ctx == NULL) /* if not properly attached? */ + return sim_messagef (SCPE_IERR, "Bad Attach\n"); /* that's a problem */ sim_debug (ctx->dbit, ctx->dptr, "sim_tape_spfilebyrecr(unit=%d, count=%d)\n", (int)(uptr-ctx->dptr->units), count); *skipped = 0; @@ -1953,6 +1993,8 @@ t_stat sim_tape_spfiler (UNIT *uptr, uint32 count, uint32 *skipped) struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; uint32 totalrecsskipped; +if (ctx == NULL) /* if not properly attached? */ + return sim_messagef (SCPE_IERR, "Bad Attach\n"); /* that's a problem */ sim_debug (ctx->dbit, ctx->dptr, "sim_tape_spfiler(unit=%d, count=%d)\n", (int)(uptr-ctx->dptr->units), count); return sim_tape_spfilebyrecr (uptr, count, skipped, &totalrecsskipped); @@ -1974,6 +2016,8 @@ t_stat sim_tape_rewind (UNIT *uptr) struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; if (uptr->flags & UNIT_ATT) { + if (ctx == NULL) /* if not properly attached? */ + return sim_messagef (SCPE_IERR, "Bad Attach\n");/* that's a problem */ sim_debug (ctx->dbit, ctx->dptr, "sim_tape_rewind(unit=%d)\n", (int)(uptr-ctx->dptr->units)); } uptr->pos = 0; @@ -1997,6 +2041,8 @@ t_stat sim_tape_position (UNIT *uptr, uint32 flags, uint32 recs, uint32 *recsski struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; t_stat r = MTSE_OK; +if (ctx == NULL) /* if not properly attached? */ + return sim_messagef (SCPE_IERR, "Bad Attach\n"); /* that's a problem */ sim_debug (ctx->dbit, ctx->dptr, "sim_tape_position(unit=%d, flags=0x%X, recs=%d, files=%d)\n", (int)(uptr-ctx->dptr->units), flags, recs, files); *recsskipped = *filesskipped = *objectsskipped = 0; @@ -2061,6 +2107,8 @@ MT_CLR_PNU (uptr); if (!(uptr->flags & UNIT_ATT)) /* attached? */ return SCPE_OK; +if (ctx == NULL) /* if not properly attached? */ + return sim_messagef (SCPE_IERR, "Bad Attach\n"); /* that's a problem */ sim_debug (ctx->dbit, ctx->dptr, "sim_tape_reset(unit=%d)\n", (int)(uptr-ctx->dptr->units)); _sim_tape_io_flush(uptr);