From 4dad413a3b9e898facb4283027a4d21cda39660e Mon Sep 17 00:00:00 2001 From: salix5 Date: Thu, 22 May 2025 19:07:59 +0800 Subject: [PATCH 1/4] check header in OpenReplay --- gframe/game.cpp | 2 +- gframe/replay.cpp | 19 ++++++++----------- gframe/replay.h | 1 - 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/gframe/game.cpp b/gframe/game.cpp index d2bac00f72..37bbebef4e 100644 --- a/gframe/game.cpp +++ b/gframe/game.cpp @@ -1256,7 +1256,7 @@ void Game::RefreshDeck(const wchar_t* deckpath, const std::functionclear(); FileSystem::TraversalDir(L"./replay", [this](const wchar_t* name, bool isdir) { - if (!isdir && IsExtension(name, L".yrp") && Replay::CheckReplay(name)) + if (!isdir && IsExtension(name, L".yrp")) lstReplayList->addItem(name); }); } diff --git a/gframe/replay.cpp b/gframe/replay.cpp index 9609afe6a8..bb0fe62106 100644 --- a/gframe/replay.cpp +++ b/gframe/replay.cpp @@ -115,6 +115,14 @@ bool Replay::OpenReplay(const wchar_t* name) { std::fclose(rfp); return false; } + if(pheader.id != 0x31707279 || pheader.version < 0x12d0u) { + std::fclose(rfp); + return false; + } + if (pheader.version >= 0x1353u && !(pheader.flag & REPLAY_UNIFORM)) { + std::fclose(rfp); + return false; + } if(pheader.flag & REPLAY_COMPRESSED) { comp_size = std::fread(comp_data, 1, MAX_COMP_SIZE, rfp); std::fclose(rfp); @@ -142,17 +150,6 @@ bool Replay::OpenReplay(const wchar_t* name) { data_position = 0; return true; } -bool Replay::CheckReplay(const wchar_t* name) { - wchar_t fname[256]; - myswprintf(fname, L"./replay/%ls", name); - FILE* rfp = mywfopen(fname, "rb"); - if(!rfp) - return false; - ReplayHeader rheader; - size_t count = std::fread(&rheader, sizeof rheader, 1, rfp); - std::fclose(rfp); - return count == 1 && rheader.id == 0x31707279 && rheader.version >= 0x12d0u && (rheader.version < 0x1353u || (rheader.flag & REPLAY_UNIFORM)); -} bool Replay::DeleteReplay(const wchar_t* name) { wchar_t fname[256]; myswprintf(fname, L"./replay/%ls", name); diff --git a/gframe/replay.h b/gframe/replay.h index de59f1db56..727ae2450a 100644 --- a/gframe/replay.h +++ b/gframe/replay.h @@ -53,7 +53,6 @@ class Replay { void SaveReplay(const wchar_t* name); // play - static bool CheckReplay(const wchar_t* name); static bool DeleteReplay(const wchar_t* name); static bool RenameReplay(const wchar_t* oldname, const wchar_t* newname); static size_t GetDeckPlayer(size_t deck_index) { From 7f9692f1ef029706160601d3e7ba20563f7a29fb Mon Sep 17 00:00:00 2001 From: salix5 Date: Thu, 22 May 2025 20:15:04 +0800 Subject: [PATCH 2/4] add version_info for old replay --- gframe/menu_handler.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/gframe/menu_handler.cpp b/gframe/menu_handler.cpp index ba61d6f3fd..1276f4d50a 100644 --- a/gframe/menu_handler.cpp +++ b/gframe/menu_handler.cpp @@ -523,10 +523,13 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { } case LISTBOX_REPLAY_LIST: { int sel = mainGame->lstReplayList->getSelected(); - if(sel == -1) + if(sel < 0) + break; + auto filename = mainGame->lstReplayList->getListItem(sel); + if (!filename) break; wchar_t replay_path[256]{}; - myswprintf(replay_path, L"./replay/%ls", mainGame->lstReplayList->getListItem(sel)); + myswprintf(replay_path, L"./replay/%ls", filename); if (!temp_replay.OpenReplay(replay_path)) { mainGame->stReplayInfo->setText(L"Error"); break; @@ -536,8 +539,13 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { time_t curtime; if(temp_replay.pheader.flag & REPLAY_UNIFORM) curtime = temp_replay.pheader.start_time; - else + else{ curtime = temp_replay.pheader.seed; + wchar_t version_info[256]{}; + myswprintf(version_info, L"version 0x%X", temp_replay.pheader.version); + repinfo.append(version_info); + repinfo.append(L"\n"); + } std::wcsftime(infobuf, sizeof infobuf / sizeof infobuf[0], L"%Y/%m/%d %H:%M:%S\n", std::localtime(&curtime)); repinfo.append(infobuf); if (temp_replay.pheader.flag & REPLAY_SINGLE_MODE) { From 447e38c7f8fae29336248122c11d64ab0531449d Mon Sep 17 00:00:00 2001 From: salix5 Date: Sat, 24 May 2025 04:11:24 +0800 Subject: [PATCH 3/4] simplify --- gframe/replay.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/gframe/replay.cpp b/gframe/replay.cpp index bb0fe62106..0f9bb7e932 100644 --- a/gframe/replay.cpp +++ b/gframe/replay.cpp @@ -111,15 +111,16 @@ bool Replay::OpenReplay(const wchar_t* name) { return false; Reset(); - if(std::fread(&pheader, sizeof pheader, 1, rfp) < 1) { - std::fclose(rfp); - return false; - } - if(pheader.id != 0x31707279 || pheader.version < 0x12d0u) { - std::fclose(rfp); - return false; - } - if (pheader.version >= 0x1353u && !(pheader.flag & REPLAY_UNIFORM)) { + bool correct_header = true; + if (std::fread(&pheader, sizeof pheader, 1, rfp) < 1) + correct_header = false; + else if (pheader.id != 0x31707279) + correct_header = false; + else if (pheader.version < 0x12d0u) + correct_header = false; + else if (pheader.version >= 0x1353u && !(pheader.flag & REPLAY_UNIFORM)) + correct_header = false; + if (!correct_header) { std::fclose(rfp); return false; } From d385db92640dfdc1842493398cef75344b4ab6cb Mon Sep 17 00:00:00 2001 From: salix5 Date: Fri, 30 May 2025 15:55:31 +0800 Subject: [PATCH 4/4] add newline char --- gframe/menu_handler.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gframe/menu_handler.cpp b/gframe/menu_handler.cpp index 1276f4d50a..1f6bcc036b 100644 --- a/gframe/menu_handler.cpp +++ b/gframe/menu_handler.cpp @@ -542,9 +542,8 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { else{ curtime = temp_replay.pheader.seed; wchar_t version_info[256]{}; - myswprintf(version_info, L"version 0x%X", temp_replay.pheader.version); + myswprintf(version_info, L"version 0x%X\n", temp_replay.pheader.version); repinfo.append(version_info); - repinfo.append(L"\n"); } std::wcsftime(infobuf, sizeof infobuf / sizeof infobuf[0], L"%Y/%m/%d %H:%M:%S\n", std::localtime(&curtime)); repinfo.append(infobuf);