Limit buffer size required to extract files. This helps avoid out of memory errors.

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@5553 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
donkopunchstania 2010-05-30 17:57:56 +00:00
parent c2daee96cc
commit 33566b5c07
1 changed files with 30 additions and 15 deletions

View File

@ -92,31 +92,46 @@ u64 CFileSystemGCWii::ReadFile(const char* _rFullPath, u8* _pBuffer, size_t _Max
bool CFileSystemGCWii::ExportFile(const char* _rFullPath, const char* _rExportFilename) const bool CFileSystemGCWii::ExportFile(const char* _rFullPath, const char* _rExportFilename) const
{ {
size_t filesize = (size_t) GetFileSize(_rFullPath); const SFileInfo* pFileInfo = FindFileInfo(_rFullPath);
if (filesize == 0) if (!pFileInfo || pFileInfo->m_FileSize == 0)
return false; return false;
u8* buffer = new u8[filesize]; u64 remainingSize = pFileInfo->m_FileSize;
u64 fileOffset = pFileInfo->m_Offset;
if (!ReadFile(_rFullPath, buffer, filesize))
{
delete[] buffer;
return false;
}
FILE* f = fopen(_rExportFilename, "wb"); FILE* f = fopen(_rExportFilename, "wb");
if (!f)
return false;
if (f) bool result = true;
while (remainingSize)
{ {
fwrite(buffer, filesize, 1, f); // Limit read size to 128 MB
fclose(f); size_t readSize = (size_t)min(remainingSize, (u64)0x08000000);
u8* buffer = new u8[readSize];
result = m_rVolume->Read(fileOffset, readSize, buffer);
if (!result)
{
delete[] buffer;
break;
}
fwrite(buffer, readSize, 1, f);
remainingSize -= readSize;
fileOffset += readSize;
delete[] buffer; delete[] buffer;
return true;
} }
delete[] buffer; fclose(f);
return false;
return result;
} }
bool CFileSystemGCWii::ExportApploader(const char* _rExportFolder) const bool CFileSystemGCWii::ExportApploader(const char* _rExportFolder) const