From f586105051dc12ae55d0ddf19fd29b6297800d6e Mon Sep 17 00:00:00 2001 From: Bob Supnik Date: Tue, 14 Mar 2017 04:48:14 -0700 Subject: [PATCH] I1620: Fix Coverity identified problems CPU: Added error test on device addr DP: Fixed bug in write check function test TTY: Fixed tab stop array overrun at right margin --- I1620/i1620_cpu.c | 9 ++++++--- I1620/i1620_dp.c | 7 ++++--- I1620/i1620_tty.c | 5 +++-- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/I1620/i1620_cpu.c b/I1620/i1620_cpu.c index 8def7c3d..458609c1 100644 --- a/I1620/i1620_cpu.c +++ b/I1620/i1620_cpu.c @@ -1,6 +1,6 @@ /* i1620_cpu.c: IBM 1620 CPU simulator - Copyright (c) 2002-2015, Robert M. Supnik + Copyright (c) 2002-2017, Robert M. Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -26,6 +26,7 @@ This CPU module incorporates code and comments from the 1620 simulator by Geoff Kuenning, with his permission. + 13-Mar-17 RMS Added error test on device addr (COVERITY) 07-May-15 RMS Added missing TFL instruction (Tom McBride) 28-Mar-15 RMS Revised to use sim_printf 26-Mar-15 RMS Separated compare from add/sub flows (Tom McBride) @@ -753,7 +754,9 @@ while (reason == 0) { /* loop until halted */ case OP_K: dev = get_2d (ADDR_A (saved_PC, I_IO)); /* get IO dev */ - if (k_valid_p[dev]) { /* validate P? */ + if (dev < 0) /* invalid digits? */ + return STOP_INVDIG; + if (k_valid_p[dev]) { /* validate P? */ reason = get_addr (pla, 5, TRUE, &PAR); /* get P addr */ if (reason != SCPE_OK) /* stop if error */ break; @@ -761,7 +764,7 @@ while (reason == 0) { /* loop until halted */ else PAR = 0; f0 = M[ADDR_A (saved_PC, I_CTL)] & DIGIT; /* get function */ f1 = M[ADDR_A (saved_PC, I_CTL + 1)] & DIGIT; - if ((dev < 0) || (iodisp[dev] == NULL)) /* undefined dev? */ + if (iodisp[dev] == NULL) /* undefined dev? */ reason = STOP_INVIO; /* stop */ else reason = iodisp[dev] (op, PAR, f0, f1); /* call device */ break; diff --git a/I1620/i1620_dp.c b/I1620/i1620_dp.c index 1f908414..fcd46b4a 100644 --- a/I1620/i1620_dp.c +++ b/I1620/i1620_dp.c @@ -1,6 +1,6 @@ /* i1620_dp.c: IBM 1311 disk simulator - Copyright (c) 2002-2015, Robert M. Supnik + Copyright (c) 2002-2017, Robert M. Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -35,6 +35,7 @@ to mean the implied sector number that would be in place if the disk pack had been formatted with sequential sector numbers. + 13-Mar-17 RMS Fixed bug in write check function test (COVERITY) 18-Oct-02 RMS Fixed bug in error testing (Hans Pufal) */ @@ -190,7 +191,7 @@ if (f1 >= FNC_WRI) /* invalid func? */ if (op == OP_RN) /* read? set wch */ qwc = f1 & FNC_WCH; else if (op == OP_WN) { /* write? */ - if (op & FNC_WCH) /* cant check */ + if (f1 & FNC_WCH) /* cant check */ return STOP_INVFNC; f1 = f1 + FNC_WRI; /* offset fnc */ } @@ -224,7 +225,7 @@ switch (f1 & ~(FNC_WCH | FNC_NRL)) { /* case on function */ } break; /* done, clean up */ - case FNC_SEC + FNC_WRI: /* write */ + case FNC_SEC + FNC_WRI: /* write sectors */ if (cnt <= 0) /* bad count? */ return STOP_INVDCN; psec = dp_fndsec (uptr, sec, FALSE); /* find sector */ diff --git a/I1620/i1620_tty.c b/I1620/i1620_tty.c index 8ba01228..e2a14c8b 100644 --- a/I1620/i1620_tty.c +++ b/I1620/i1620_tty.c @@ -1,6 +1,6 @@ /* i1620_tty.c: IBM 1620 typewriter - Copyright (c) 2002-2015, Robert M. Supnik + Copyright (c) 2002-2017, Robert M. Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -25,6 +25,7 @@ tty console typewriter + 13-Mar-17 RMS Fixed tab stop array overrun at right margin (COVERITY) 21-Feb-15 TFM Option to provide single digit numeric output 05-Feb-15 TFM Changes to translate tables and valid input char. 02-Jan-14 RMS Added variable tab stops @@ -420,7 +421,7 @@ int32 rpt; if (c == '\t') { /* tab? */ for (rpt = tto_col + 1; /* find tab stop */ - (tto_tabs[rpt] == 0) && (rpt <= TTO_COLMAX); + (rpt <= TTO_COLMAX) && (tto_tabs[rpt] == 0); rpt++) ; for ( ; tto_col < rpt; tto_col++) sim_putchar (' '); /* use spaces */