From dc41268bfc8656ad9c303e30b17c99e051ee8d08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 23 Oct 2026 10:55:27 +0200 Subject: [PATCH] Firmware: Ignore empty updaters on discs UMD Video discs ship an updater PARAM.SFO next to a 0-byte DATA.BIN, and PSN releases zero-fill it. MountedDiscHasUpdater() only checked that DATA.BIN existed, so booting the EUR Video Demo Disc's game with no firmware installed started an auto-install of "2.00" that failed with an OSD error. It now wants a PSAR archive, like ReadBundledUpdateInfo() already did. The game info screen no longer looks for an updater on UMD Video discs at all. Co-Authored-By: Claude Opus 5.5 (1M context) --- Core/Util/PSARUnpack.cpp | 5 ++++- UI/GameInfoCache.cpp | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Core/Util/PSARUnpack.cpp b/Core/Util/PSARUnpack.cpp index 0fc1526b5d..4821bf7df8 100644 --- a/Core/Util/PSARUnpack.cpp +++ b/Core/Util/PSARUnpack.cpp @@ -1474,7 +1474,10 @@ static std::string ReadUpdaterVersionFromArchiveHeader() { } bool MountedDiscHasUpdater() { - return pspFileSystem.GetFileInfo(std::string("disc0:/") + UPDATE_PSAR_SUFFIX).exists; + // Plenty of discs keep the updater's files with nothing in them: UMD Video discs ship a 0-byte + // DATA.BIN next to a real PARAM.SFO, PSN releases zero-fill it. Only an actual archive counts. + std::vector head; + return ReadHeadFromMountedDisc(UPDATE_PSAR_SUFFIX, 4, &head) && head.size() == 4 && ReadU32(head.data()) == PSAR_MAGIC; } std::string ReadMountedDiscUpdaterVersion() { diff --git a/UI/GameInfoCache.cpp b/UI/GameInfoCache.cpp index ebde4182cd..b83d53ad00 100644 --- a/UI/GameInfoCache.cpp +++ b/UI/GameInfoCache.cpp @@ -881,7 +881,8 @@ handleELF: // Most UMDs carry a firmware updater, which is a source of things like the // system fonts. Just note down what's there - unpacking it is a separate step. - if (flags_ & GameInfoFlags::BUNDLED_UPDATE_INFO) { + // UMD Video discs only carry a placeholder (an empty DATA.BIN), so they're skipped. + if ((flags_ & GameInfoFlags::BUNDLED_UPDATE_INFO) && fileType != IdentifiedFileType::PSP_UMD_VIDEO_ISO) { BundledUpdateInfo update; ReadBundledUpdateInfo(&umd, "/", &update); std::lock_guard lock(info_->lock);