some missing error handling
[pcsx_rearmed.git] / libpcsxcore / misc.c
index 3d16471..702f690 100644 (file)
@@ -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) {