From 410467ad9e6cc35b77eb252a892b94707bef78d1 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sat, 23 Mar 2019 14:19:15 +0200 Subject: [PATCH] Reject TAPE read/write if fixed bit is not set. Emulated drive is not variable block compatible. --- scsitape.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/scsitape.cpp b/scsitape.cpp index 839a4d06..fdc1c0a6 100644 --- a/scsitape.cpp +++ b/scsitape.cpp @@ -109,6 +109,8 @@ static void tape_init (int unit, struct scsi_data_tape *tape, const TCHAR *tape_ bool tape_can_write(const TCHAR *tape_directory) { TCHAR tmp[MAX_DPATH]; + if (!tape_directory[0]) + return false; if (my_existsdir(tape_directory)) return true; _tcscpy(tmp, tape_directory); @@ -549,9 +551,10 @@ int scsi_tape_emulate (struct scsi_data_tape *tape, uae_u8 *cmdbuf, int scsi_cmd break; case 0x0a: /* WRITE (6) */ + if (!(cmdbuf[1] & 1)) + goto errreq; len = rl (cmdbuf + 1) & 0xffffff; - if (cmdbuf[1] & 1) - len *= tape->blocksize; + len *= tape->blocksize; if (log_tapeemu) write_log (_T("TAPEEMU WRITE %lld (%d, %d)\n"), len, rl (cmdbuf + 1) & 0xffffff, cmdbuf[1] & 1); if (notape (tape)) @@ -569,9 +572,10 @@ int scsi_tape_emulate (struct scsi_data_tape *tape, uae_u8 *cmdbuf, int scsi_cmd break; case 0x08: /* READ (6) */ + if (!(cmdbuf[1] & 1)) + goto errreq; len = rl (cmdbuf + 1) & 0xffffff; - if (cmdbuf[1] & 1) - len *= tape->blocksize; + len *= tape->blocksize; if (log_tapeemu) write_log (_T("TAPEEMU READ %lld (%d, %d)\n"), len, rl (cmdbuf + 1) & 0xffffff, cmdbuf[1] & 1); if (notape (tape)) -- 2.47.3