DISK: Assure that all reads past EOF read as 0 data, even partial sector reads
This commit is contained in:
parent
18d6247cb7
commit
a5b7ebe44b
1 changed files with 14 additions and 6 deletions
18
sim_disk.c
18
sim_disk.c
|
@ -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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue