From b82feed8161d7ded53e4b3cfd7c8d47348275258 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 8 Feb 2013 10:35:05 -0800 Subject: [PATCH 1/3] Fix leaking VFS DirectoryAssetReaders. --- Windows/main.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Windows/main.cpp b/Windows/main.cpp index c875f0c7b2..b568189d07 100644 --- a/Windows/main.cpp +++ b/Windows/main.cpp @@ -191,6 +191,8 @@ int WINAPI WinMain(HINSTANCE _hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLin } } + VFSShutdown(); + LogManager::Shutdown(); DialogManager::DestroyAll(); timeEndPeriod(1); From 2ea113369bcc08204d1f481fad9d22c1cdc2b58d Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 8 Feb 2013 10:41:01 -0800 Subject: [PATCH 2/3] Fix memory leak in CSO reading. --- Core/FileSystems/BlockDevices.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Core/FileSystems/BlockDevices.cpp b/Core/FileSystems/BlockDevices.cpp index c413209c0c..7d270260f5 100644 --- a/Core/FileSystems/BlockDevices.cpp +++ b/Core/FileSystems/BlockDevices.cpp @@ -165,14 +165,17 @@ bool CISOFileBlockDevice::ReadBlock(int blockNumber, u8 *outPtr) //if (status != Z_OK) { ERROR_LOG(LOADER, "block %d:inflate : %s[%d]\n", blockNumber, (z.msg) ? z.msg : "error", status); + inflateEnd(&z); return 1; } int cmp_size = blockSize - z.avail_out; if (cmp_size != (int)blockSize) { ERROR_LOG(LOADER, "block %d : block size error %d != %d\n", blockNumber, cmp_size, blockSize); + inflateEnd(&z); return 1; } + inflateEnd(&z); } return true; } From db18eba388e3ddb1ecab773505548b12e272f6c3 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 8 Feb 2013 13:17:47 -0800 Subject: [PATCH 3/3] Fix a crash in CSO reading (probably a bad rip.) This could happen if sce_lbn is used out of bounds, maybe? --- Core/FileSystems/BlockDevices.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Core/FileSystems/BlockDevices.cpp b/Core/FileSystems/BlockDevices.cpp index 7d270260f5..4b74a422e1 100644 --- a/Core/FileSystems/BlockDevices.cpp +++ b/Core/FileSystems/BlockDevices.cpp @@ -123,6 +123,12 @@ CISOFileBlockDevice::~CISOFileBlockDevice() bool CISOFileBlockDevice::ReadBlock(int blockNumber, u8 *outPtr) { + if ((u32)blockNumber >= numBlocks) + { + memset(outPtr, 0, 2048); + return false; + } + u32 idx = index[blockNumber]; u32 idx2 = index[blockNumber+1]; u8 inbuffer[4096]; //too big @@ -153,7 +159,7 @@ bool CISOFileBlockDevice::ReadBlock(int blockNumber, u8 *outPtr) if(inflateInit2(&z, -15) != Z_OK) { ERROR_LOG(LOADER, "deflateInit ERROR : %s\n", (z.msg) ? z.msg : "???"); - return 1; + return false; } z.avail_in = readSize; z.next_out = outPtr; @@ -173,7 +179,7 @@ bool CISOFileBlockDevice::ReadBlock(int blockNumber, u8 *outPtr) { ERROR_LOG(LOADER, "block %d : block size error %d != %d\n", blockNumber, cmp_size, blockSize); inflateEnd(&z); - return 1; + return false; } inflateEnd(&z); }