Pull Request Overview
- Opened on September 19, 2026
- Status Open
- Commit count 0
Total Delta
Open Days
Test Delta
How long has this pull request spent in each phase of its lifecycle?
Data pending calculation for pull request
[TESTERS NEEDED] Fix check on game data path
try to fix #14402.
Further, fix other two discovered bugs (2 and 3), cross checked with other PRs.
NOTE: fix 1 can be a sort of hsck / workaround but based on invoked API it seems there is no other possibility than storing the path on cellGameDataCheckCreate2 for further usage on cellGameDataGetSizeKB.
probably fixes #14402
Analysis, cross checks and fixes made by Opus 5.
List of fixes:
1 β cellGameDataGetSizeKB() measures the boot directory instead of the game data (issue #14402 (https://github.com/RPCS3/rpcs3/issues/14402), Leisure Suit Larry: Box Office Bust)
- Regression source: commit f4d2fccdf "Improve boot dir access" (Nekotekina, 2018-03-11) β pushed directly, no PR. It replaced /dev_hdd0/game/ (from 149c08ba7) with Emu.GetDir() across the file. Harmless for HDD-booted games, wrong for disc games, which are the ones that use this API.
- Symptom: the function reports the whole disc (DataSize: 1913289 KB = 1868 MB) as already-installed game data, so the game decides no install is required, never writes USRDIR/UnrealEngine3/..., and later dies on STW r0,0x3(r0) at 0x0011628c.
- Proof: DataSize is byte-identical across two runs whose /dev_hdd0/game/BLUS30331 contents differ β it can only be measuring the immutable disc folder. hddFreeSizeKB in the same trace matches the hardcoded 40 * 1024 * 1024 - 256, confirming the numbers come from HLE.
- Fix: remember the content directory of the in-flight cellGameDataCheckCreate2() and measure that; fall back to Emu.GetDir() before the first check, so behaviour is unchanged where it was never exercised.
- Why per-call state is unavoidable: one game checks several directories. Rock Band 2 (BLES00385) checks its own game data and then Rock Band's (BLES00228) to import songs β issue #7898 (https://github.com/RPCS3/rpcs3/issues/7898). Neither the boot directory nor the title id can answer both.
- Why not the title id: PR #14956 (https://github.com/RPCS3/rpcs3/pull/14956) / issue #14954 (https://github.com/RPCS3/rpcs3/issues/14954) β games install under directory names that differ from their title id (Uncharted: Eye of Indra ships as NPUA80234_UNCHARTED2EOI002).
2 β cellGameDeleteGameData() can delete the running patch's own directory
- Source: PR #8962 (https://github.com/RPCS3/rpcs3/pull/8962) c806da51f (2020-09-24). Not a later regression β the guard has never worked. At that commit m_dir for a GD boot was already "/dev_hdd0/game/" + substr(β¦, 10), the 10th character being the separator.
- Defect: Emu.GetDir().substr(Emu.GetDir().find_la st_of('/') + 1) is evaluated on a string that always ends in a separator, so it is always "", never equal to a dirName (minimum length 1, enforced by sysutil_check_name_string). Control reaches vfs::host::remove_all().
- Verified exhaustively with a compiled probe over all nine m_dir assignment sites plus the pre-boot empty case.
- Fix: strip trailing delimiters first β fmt::trim_back_sv(Emu.GetDir(), fs::delim), then take the last component. Not the get_parent_dir_view idiom used at cellGame.cpp:798, which yields pp_home for /app_home/.
3 β cellGameGetBootGameInfo() returns a path in a field that holds a directory name
- Source: PR #11749 (https://github.com/RPCS3/rpcs3/pull/11749) d84a0c650 (2022-04-09), which added the function
(the PR is titled after an unrelated cellOskDialogAbort fix). - Defect: writes "/dev_hdd0/game/NPEB00001/" into a CELL_GAME_DIRNAME_SIZE (32-byte) dirName buffer. No overflow, but the wrong value β and the existing >= CELL_GAME_DIRNAME_SIZE check only makes sense for a bare name, since the 15-character prefix would reject an otherwise legal 18-character dirName.
- Evidence for the expected format: PR #14956 (https://github.com/RPCS3/rpcs3/pull/14956) changed the sibling cellGameBootCheck() to write the real directory name instead of the title id, in the same field. sysutil_check_name_string() β which validates every dirName the API accepts as input β rejects / outright.
- Reachability: low. Only with cfg_mode::continuous (one game booting another).
Comments Threads Pending Resolution
Resolved Comment Threads
No resolved comments have been left on this PR.