diff --git a/src/openrct2/FileClassifier.cpp b/src/openrct2/FileClassifier.cpp index 982d774084..b99e1c7061 100644 --- a/src/openrct2/FileClassifier.cpp +++ b/src/openrct2/FileClassifier.cpp @@ -95,57 +95,71 @@ static bool TryClassifyAsS6(IStream * stream, ClassifiedFileInfo * result) static bool TryClassifyAsS4(IStream * stream, ClassifiedFileInfo * result) { + bool success = false; uint64 originalPosition = stream->GetPosition(); - size_t dataLength = (size_t)stream->GetLength(); - uint8 * data = stream->ReadArray(dataLength); + try + { + size_t dataLength = (size_t)stream->GetLength(); + uint8 * data = stream->ReadArray(dataLength); + stream->SetPosition(originalPosition); + sint32 fileTypeVersion = sawyercoding_detect_file_type(data, dataLength); + Memory::Free(data); + + sint32 type = fileTypeVersion & FILE_TYPE_MASK; + sint32 version = fileTypeVersion & FILE_VERSION_MASK; + + if (type == FILE_TYPE_SV4) + { + result->Type = FILE_TYPE::SAVED_GAME; + result->Version = version; + success = true; + } + else if (type == FILE_TYPE_SC4) + { + result->Type = FILE_TYPE::SCENARIO; + result->Version = version; + success = true; + } + } + catch (Exception) + { + } + stream->SetPosition(originalPosition); - sint32 fileTypeVersion = sawyercoding_detect_file_type(data, dataLength); - Memory::Free(data); - - sint32 type = fileTypeVersion & FILE_TYPE_MASK; - sint32 version = fileTypeVersion & FILE_VERSION_MASK; - - if (type == FILE_TYPE_SV4) - { - result->Type = FILE_TYPE::SAVED_GAME; - result->Version = version; - return true; - } - else if (type == FILE_TYPE_SC4) - { - result->Type = FILE_TYPE::SCENARIO; - result->Version = version; - return true; - } - - return false; + return success; } static bool TryClassifyAsTD4_TD6(IStream * stream, ClassifiedFileInfo * result) { bool success = false; uint64 originalPosition = stream->GetPosition(); - size_t dataLength = (size_t)stream->GetLength(); - uint8 * data = stream->ReadArray(dataLength); - stream->SetPosition(originalPosition); - - if (sawyercoding_validate_track_checksum(data, dataLength)) + try { - uint8 * td6data = Memory::Allocate(0x10000); - size_t td6len = sawyercoding_decode_td6(data, td6data, dataLength); - if (td6data != nullptr && td6len >= 8) + size_t dataLength = (size_t)stream->GetLength(); + uint8 * data = stream->ReadArray(dataLength); + stream->SetPosition(originalPosition); + + if (sawyercoding_validate_track_checksum(data, dataLength)) { - uint8 version = (td6data[7] >> 2) & 3; - if (version <= 2) + uint8 * td6data = Memory::Allocate(0x10000); + size_t td6len = sawyercoding_decode_td6(data, td6data, dataLength); + if (td6data != nullptr && td6len >= 8) { - result->Type = FILE_TYPE::TRACK_DESIGN; - result->Version = version; - success = true; + uint8 version = (td6data[7] >> 2) & 3; + if (version <= 2) + { + result->Type = FILE_TYPE::TRACK_DESIGN; + result->Version = version; + success = true; + } } + Memory::Free(td6data); } - Memory::Free(td6data); + Memory::Free(data); + } + catch (Exception) + { } - Memory::Free(data); return success; }