X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libpcsxcore%2Fppf.c;h=18c5413ed40a8489a41c3ac9a2cbe31f106e81c5;hb=e0f25b64cf98406b7059b373b04a18b45e2a0aa7;hp=edebdd03768638be3d2fe15a3f179347349d87cb;hpb=eed148b7fcde73477379388da58d12cd379a6a81;p=pcsx_rearmed.git diff --git a/libpcsxcore/ppf.c b/libpcsxcore/ppf.c index edebdd03..18c5413e 100644 --- a/libpcsxcore/ppf.c +++ b/libpcsxcore/ppf.c @@ -183,7 +183,7 @@ void BuildPPFCache() { char method, undo = 0, blockcheck = 0; int dizlen, dizyn; unsigned char ppfmem[512]; - char szPPF[MAXPATHLEN]; + char szPPF[MAXPATHLEN * 2]; int count, seekpos, pos; u32 anz; // use 32-bit to avoid stupid overflows s32 ladr, off, anx; @@ -212,7 +212,8 @@ void BuildPPFCache() { if (ppffile == NULL) return; memset(buffer, 0, 5); - fread(buffer, 3, 1, ppffile); + if (fread(buffer, 1, 3, ppffile) != 3) + goto fail_io; if (strcmp(buffer, "PPF") != 0) { SysPrintf(_("Invalid PPF patch: %s.\n"), szPPF); @@ -235,12 +236,14 @@ void BuildPPFCache() { fseek(ppffile, -8, SEEK_END); memset(buffer, 0, 5); - fread(buffer, 4, 1, ppffile); + if (fread(buffer, 1, 4, ppffile) != 4) + goto fail_io; if (strcmp(".DIZ", buffer) != 0) { dizyn = 0; } else { - fread(&dizlen, 4, 1, ppffile); + if (fread(&dizlen, 1, 4, ppffile) != 4) + goto fail_io; dizlen = SWAP32(dizlen); dizyn = 1; } @@ -266,12 +269,15 @@ void BuildPPFCache() { fseek(ppffile, -6, SEEK_END); memset(buffer, 0, 5); - fread(buffer, 4, 1, ppffile); + if (fread(buffer, 1, 4, ppffile) != 4) + goto fail_io; dizlen = 0; if (strcmp(".DIZ", buffer) == 0) { fseek(ppffile, -2, SEEK_END); - fread(&dizlen, 2, 1, ppffile); + // TODO: Endian/size unsafe? + if (fread(&dizlen, 1, 2, ppffile) != 2) + goto fail_io; dizlen = SWAP32(dizlen); dizlen += 36; } @@ -298,13 +304,19 @@ void BuildPPFCache() { // now do the data reading do { fseek(ppffile, seekpos, SEEK_SET); - fread(&pos, 4, 1, ppffile); + if (fread(&pos, 1, sizeof(pos), ppffile) != sizeof(pos)) + goto fail_io; pos = SWAP32(pos); - if (method == 2) fread(buffer, 4, 1, ppffile); // skip 4 bytes on ppf3 (no int64 support here) + if (method == 2) { + // skip 4 bytes on ppf3 (no int64 support here) + if (fread(buffer, 1, 4, ppffile) != 4) + goto fail_io; + } anz = fgetc(ppffile); - fread(ppfmem, anz, 1, ppffile); + if (fread(ppfmem, 1, anz, ppffile) != anz) + goto fail_io; ladr = pos / CD_FRAMESIZE_RAW; off = pos % CD_FRAMESIZE_RAW; @@ -331,6 +343,12 @@ void BuildPPFCache() { FillPPFCache(); // build address array SysPrintf(_("Loaded PPF %d.0 patch: %s.\n"), method + 1, szPPF); + +fail_io: +#ifndef NDEBUG + SysPrintf(_("File IO error in <%s:%s>.\n"), __FILE__, __func__); +#endif + fclose(ppffile); } // redump.org SBI files, slightly different handling from PCSX-Reloaded @@ -353,12 +371,15 @@ int LoadSBI(const char *fname, int sector_count) { } // 4-byte SBI header - fread(buffer, 1, 4, sbihandle); + if (fread(buffer, 1, 4, sbihandle) != 4) + goto fail_io; + while (1) { s = fread(sbitime, 1, 3, sbihandle); if (s != 3) - break; - fread(&t, 1, 1, sbihandle); + goto fail_io; + if (fread(&t, 1, sizeof(t), sbihandle) != sizeof(t)) + goto fail_io; switch (t) { default: case 1: @@ -379,8 +400,14 @@ int LoadSBI(const char *fname, int sector_count) { } fclose(sbihandle); - return 0; + +fail_io: +#ifndef NDEBUG + SysPrintf(_("File IO error in <%s:%s>.\n"), __FILE__, __func__); +#endif + fclose(sbihandle); + return -1; } void UnloadSBI(void) {