From a5b7ebe44b6da4c4c6cd0c757edbad8ecc5ea56b Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Wed, 27 Jan 2021 12:47:36 -0800 Subject: [PATCH] DISK: Assure that all reads past EOF read as 0 data, even partial sector reads --- sim_disk.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/sim_disk.c b/sim_disk.c index 659cb4a4..5ab6cb56 100644 --- a/sim_disk.c +++ b/sim_disk.c @@ -624,9 +624,11 @@ while (tbc) { i = sim_fread (buf, 1, tbc, uptr->fileref); if (i < tbc) /* fill */ memset (&buf[i], 0, tbc-i); - if (sectsread) - *sectsread += i / ctx->sector_size; sectbytes = (i / ctx->sector_size) * ctx->sector_size; + if (i > sectbytes) + sectbytes += ctx->sector_size; + if (sectsread) + *sectsread += sectbytes / ctx->sector_size; err = ferror (uptr->fileref); if (err) return SCPE_IOERR; @@ -3737,7 +3739,11 @@ while (bytestoread) { _set_errno_from_status (GetLastError ()); return SCPE_IOERR; } - sectorbytes = (bytesread / ctx->sector_size) * ctx->sector_size; + sectorbytes = (bytesread / ctx->sector_size) * ctx->sector_size; + if (bytesread > sectorbytes) { + memset (buf + bytesread, 0, bytestoread - bytesread); + sectorbytes += ctx->sector_size; + } if (sectsread) *sectsread += sectorbytes / ctx->sector_size; bytestoread -= sectorbytes; @@ -3933,15 +3939,17 @@ while (bytestoread) { if (bytesread < 0) { return SCPE_IOERR; } - if (bytesread == 0) { /* read zeros at/past EOF */ + if (bytesread < bytestoread) { /* read zeros at/past EOF */ + memset (buf + bytesread, 0, bytestoread - bytesread); bytesread = bytestoread; - memset (buf, 0, bytesread); } sectorbytes = (bytesread / ctx->sector_size) * ctx->sector_size; + if (bytesread > sectorbytes) + sectorbytes += ctx->sector_size; if (sectsread) *sectsread += sectorbytes / ctx->sector_size; bytestoread -= sectorbytes; - if (bytestoread == 0) + if ((bytestoread == 0) || (bytesread == 0)) break; buf += sectorbytes; addr += sectorbytes;