X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libpcsxcore%2Fmisc.c;h=702f690fb0e8b1017a6c75b4edcc23f810611a23;hb=cfa5a2aff5202aadca7d19c76b61c80cec5b327c;hp=3d1647102104209aede928ef76ac91572ec6455a;hpb=7c3332fbf8ea98bf43f5de9e966bbae77dd9f61d;p=pcsx_rearmed.git diff --git a/libpcsxcore/misc.c b/libpcsxcore/misc.c index 3d164710..702f690f 100644 --- a/libpcsxcore/misc.c +++ b/libpcsxcore/misc.c @@ -628,11 +628,12 @@ static const u32 SaveVersion = 0x8b410006; int SaveState(const char *file) { void *f; - GPUFreeze_t *gpufP; - SPUFreezeHdr_t *spufH; - SPUFreeze_t *spufP; + GPUFreeze_t *gpufP = NULL; + SPUFreezeHdr_t spufH; + SPUFreeze_t *spufP = NULL; + unsigned char *pMem = NULL; + int result = -1; int Size; - unsigned char *pMem; f = SaveFuncs.open(file, "wb"); if (f == NULL) return -1; @@ -644,7 +645,7 @@ int SaveState(const char *file) { SaveFuncs.write(f, (void *)&Config.HLE, sizeof(boolean)); pMem = (unsigned char *)malloc(128 * 96 * 3); - if (pMem == NULL) return -1; + if (pMem == NULL) goto cleanup; GPU_getScreenPic(pMem); SaveFuncs.write(f, pMem, 128 * 96 * 3); free(pMem); @@ -660,20 +661,20 @@ int SaveState(const char *file) { // gpu gpufP = (GPUFreeze_t *)malloc(sizeof(GPUFreeze_t)); + if (gpufP == NULL) goto cleanup; gpufP->ulFreezeVersion = 1; GPU_freeze(1, gpufP); SaveFuncs.write(f, gpufP, sizeof(GPUFreeze_t)); - free(gpufP); + free(gpufP); gpufP = NULL; // spu - spufH = malloc(sizeof(*spufH)); - SPU_freeze(2, (SPUFreeze_t *)spufH, psxRegs.cycle); - Size = spufH->Size; SaveFuncs.write(f, &Size, 4); - free(spufH); + SPU_freeze(2, (SPUFreeze_t *)&spufH, psxRegs.cycle); + Size = spufH.Size; SaveFuncs.write(f, &Size, 4); spufP = (SPUFreeze_t *) malloc(Size); + if (spufP == NULL) goto cleanup; SPU_freeze(1, spufP, psxRegs.cycle); SaveFuncs.write(f, spufP, Size); - free(spufP); + free(spufP); spufP = NULL; sioFreeze(f, 1); cdrFreeze(f, 1); @@ -682,19 +683,21 @@ int SaveState(const char *file) { mdecFreeze(f, 1); new_dyna_freeze(f, 1); + result = 0; +cleanup: SaveFuncs.close(f); - - return 0; + return result; } int LoadState(const char *file) { void *f; - GPUFreeze_t *gpufP; - SPUFreeze_t *spufP; + GPUFreeze_t *gpufP = NULL; + SPUFreeze_t *spufP = NULL; int Size; char header[32]; u32 version; boolean hle; + int result = -1; f = SaveFuncs.open(file, "rb"); if (f == NULL) return -1; @@ -704,8 +707,8 @@ int LoadState(const char *file) { SaveFuncs.read(f, &hle, sizeof(boolean)); if (strncmp("STv4 PCSX", header, 9) != 0 || version != SaveVersion) { - SaveFuncs.close(f); - return -1; + SysPrintf("incompatible savestate version %x\n", version); + goto cleanup; } Config.HLE = hle; @@ -726,6 +729,7 @@ int LoadState(const char *file) { // gpu gpufP = (GPUFreeze_t *)malloc(sizeof(GPUFreeze_t)); + if (gpufP == NULL) goto cleanup; SaveFuncs.read(f, gpufP, sizeof(GPUFreeze_t)); GPU_freeze(0, gpufP); free(gpufP); @@ -735,6 +739,7 @@ int LoadState(const char *file) { // spu SaveFuncs.read(f, &Size, 4); spufP = (SPUFreeze_t *)malloc(Size); + if (spufP == NULL) goto cleanup; SaveFuncs.read(f, spufP, Size); SPU_freeze(0, spufP, psxRegs.cycle); free(spufP); @@ -746,9 +751,10 @@ int LoadState(const char *file) { mdecFreeze(f, 0); new_dyna_freeze(f, 0); + result = 0; +cleanup: SaveFuncs.close(f); - - return 0; + return result; } int CheckState(const char *file) {