DISK: Assure that all reads past EOF read as 0 data, even partial sector reads

This commit is contained in:
Mark Pizzolato 2021-01-27 12:47:36 -08:00
parent 18d6247cb7
commit a5b7ebe44b

View file

@ -624,9 +624,11 @@ while (tbc) {
i = sim_fread (buf, 1, tbc, uptr->fileref); i = sim_fread (buf, 1, tbc, uptr->fileref);
if (i < tbc) /* fill */ if (i < tbc) /* fill */
memset (&buf[i], 0, tbc-i); memset (&buf[i], 0, tbc-i);
if (sectsread)
*sectsread += i / ctx->sector_size;
sectbytes = (i / ctx->sector_size) * 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); err = ferror (uptr->fileref);
if (err) if (err)
return SCPE_IOERR; return SCPE_IOERR;
@ -3738,6 +3740,10 @@ while (bytestoread) {
return SCPE_IOERR; 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) if (sectsread)
*sectsread += sectorbytes / ctx->sector_size; *sectsread += sectorbytes / ctx->sector_size;
bytestoread -= sectorbytes; bytestoread -= sectorbytes;
@ -3933,15 +3939,17 @@ while (bytestoread) {
if (bytesread < 0) { if (bytesread < 0) {
return SCPE_IOERR; 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; bytesread = bytestoread;
memset (buf, 0, bytesread);
} }
sectorbytes = (bytesread / ctx->sector_size) * ctx->sector_size; sectorbytes = (bytesread / ctx->sector_size) * ctx->sector_size;
if (bytesread > sectorbytes)
sectorbytes += ctx->sector_size;
if (sectsread) if (sectsread)
*sectsread += sectorbytes / ctx->sector_size; *sectsread += sectorbytes / ctx->sector_size;
bytestoread -= sectorbytes; bytestoread -= sectorbytes;
if (bytestoread == 0) if ((bytestoread == 0) || (bytesread == 0))
break; break;
buf += sectorbytes; buf += sectorbytes;
addr += sectorbytes; addr += sectorbytes;