diff --git a/src/ace/utils/disk_file.c b/src/ace/utils/disk_file.c index 053d0fe0..c4048b3b 100644 --- a/src/ace/utils/disk_file.c +++ b/src/ace/utils/disk_file.c @@ -105,7 +105,7 @@ DISKFILE_PRIVATE ULONG diskFileRead(void *pData, void *pDest, ULONG ulSize) { if(!pDiskFileData->isUninterrupted) { fileAccessEnable(); } - ULONG ulReadPartSize = fread(pDestBytes, ulSize, 1, pDiskFileData->pFileHandle); + ULONG ulReadPartSize = fread(pDestBytes, 1, ulSize, pDiskFileData->pFileHandle); pDestBytes += ulReadPartSize; ulReadCount += ulReadPartSize; ulSize -= ulReadPartSize; diff --git a/src/mini_std/stdio_file.c b/src/mini_std/stdio_file.c index ef0dadfb..2d3bef6b 100644 --- a/src/mini_std/stdio_file.c +++ b/src/mini_std/stdio_file.c @@ -1,6 +1,7 @@ #include #include #include +#include // Some things are implemented from scratch, some are based on: // https://github.com/deplinenoise/amiga-sdk/blob/master/netinclude/stdio.h @@ -36,25 +37,21 @@ FILE *fopen(const char *restrict szFileName, const char *restrict szMode) { size_t fread(void *restrict pBuffer, size_t Size, size_t Count, FILE *restrict pStream) { // http://amigadev.elowar.com/read/ADCD_2.1/Includes_and_Autodocs_3._guide/node01A0.html - unsigned char *pByteBuffer = (unsigned char *)pBuffer; - size_t BytesRead = 0; - while(Count--) { - // FIXME: handle 0/negative vals - BytesRead += Read((BPTR)pStream, pByteBuffer, Size); - pByteBuffer += Size; - } - return BytesRead; + if(Size == 0 || Count == 0) return 0; + if(Count > SIZE_MAX / Size) return 0; + // Read() returns -1 on error (IoErr() has details) + LONG lBytesRead = Read((BPTR)pStream, pBuffer, Size * Count); + if(lBytesRead <= 0) return 0; + return (size_t)lBytesRead / Size; } size_t fwrite(const void *restrict pBuffer, size_t Size, size_t Count, FILE *restrict pStream) { // http://amigadev.elowar.com/read/ADCD_2.1/Includes_and_Autodocs_3._guide/node01D1.html - unsigned char *pByteBuffer = (unsigned char *)pBuffer; - size_t BytesWritten = 0; - while(Count--) { - BytesWritten += Write((BPTR)pStream, pByteBuffer, Size); - pByteBuffer += Size; - } - return BytesWritten; + if(Size == 0 || Count == 0) return 0; + if(Count > SIZE_MAX / Size) return 0; + LONG lBytesWritten = Write((BPTR)pStream, (void *)pBuffer, Size * Count); + if(lBytesWritten < 0) return 0; + return (size_t)lBytesWritten / Size; } int fclose(FILE *pStream) {