mirror of https://github.com/PCSX2/pcsx2.git
MultipartFileReader: Fix use-after-free when opening multipart files
Also fixes loading uppercase filenames on Linux.
This commit is contained in:
parent
f2713462cc
commit
8bbcb05303
|
@ -262,10 +262,7 @@ bool InputIsoFile::Open(std::string srcfile, bool testOnly)
|
||||||
m_reader->SetBlockSize(m_blocksize);
|
m_reader->SetBlockSize(m_blocksize);
|
||||||
|
|
||||||
// Returns the original reader if single-part or a Multipart reader otherwise
|
// Returns the original reader if single-part or a Multipart reader otherwise
|
||||||
AsyncFileReader* m_reader_old = m_reader;
|
|
||||||
m_reader = MultipartFileReader::DetectMultipart(m_reader);
|
m_reader = MultipartFileReader::DetectMultipart(m_reader);
|
||||||
if (m_reader != m_reader_old) // Not the same object the old one need to be deleted
|
|
||||||
delete m_reader_old;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_blocks = m_reader->GetBlockCount();
|
m_blocks = m_reader->GetBlockCount();
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
|
|
||||||
// Tests for a filename extension in both upper and lower case, if the filesystem happens
|
// Tests for a filename extension in both upper and lower case, if the filesystem happens
|
||||||
// to be case-sensitive.
|
// to be case-sensitive.
|
||||||
static bool pxFileExists_WithExt( const std::string& filename, const std::string& ext )
|
static bool pxFileExists_WithExt( std::string& filename, const std::string& ext )
|
||||||
{
|
{
|
||||||
std::string temp(Path::ReplaceExtension(filename, StringUtil::toLower(ext)));
|
std::string temp(Path::ReplaceExtension(filename, StringUtil::toLower(ext)));
|
||||||
if (FileSystem::FileExists(temp.c_str()))
|
if (FileSystem::FileExists(temp.c_str()))
|
||||||
|
@ -31,7 +31,11 @@ static bool pxFileExists_WithExt( const std::string& filename, const std::string
|
||||||
#if defined(_WIN32) || defined(__DARWIN__)
|
#if defined(_WIN32) || defined(__DARWIN__)
|
||||||
temp = Path::ReplaceExtension(filename, StringUtil::toUpper(ext));
|
temp = Path::ReplaceExtension(filename, StringUtil::toUpper(ext));
|
||||||
if (FileSystem::FileExists(temp.c_str()))
|
if (FileSystem::FileExists(temp.c_str()))
|
||||||
|
{
|
||||||
|
// make sure we open the correct one
|
||||||
|
filename = std::move(temp);
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -114,11 +118,17 @@ void MultipartFileReader::FindParts()
|
||||||
break;
|
break;
|
||||||
|
|
||||||
Part* thispart = m_parts + m_numparts;
|
Part* thispart = m_parts + m_numparts;
|
||||||
AsyncFileReader* thisreader = thispart->reader = new FlatFileReader();
|
AsyncFileReader* thisreader = new FlatFileReader();
|
||||||
|
|
||||||
|
if (!thisreader->Open(nameparts))
|
||||||
|
{
|
||||||
|
delete thisreader;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
thisreader->Open(nameparts);
|
|
||||||
thisreader->SetBlockSize(bsize);
|
thisreader->SetBlockSize(bsize);
|
||||||
|
|
||||||
|
thispart->reader = thisreader;
|
||||||
thispart->start = blocks;
|
thispart->start = blocks;
|
||||||
|
|
||||||
uint bcount = thisreader->GetBlockCount();
|
uint bcount = thisreader->GetBlockCount();
|
||||||
|
|
Loading…
Reference in New Issue