We were unable to construct the commit group for this pull request: None of the pull request's commits have been successfully processed as yet.

[TESTERS NEEDED] Fix check on game data path #19536

Open
digant73 opened 11:25am on September 19, 2026 wants to merge 0 commits into rpcs3/rpcs3 master from
fix_check_on_data_path

Pull Request Overview

  • Opened on September 19, 2026
  • Status Open
  • Commit count 0

Total Delta

0 Total Diff Delta

Open Days

Open 0 weekdays

Test Delta

0 Diff Delta in Test Files
Breakdown by Phase

How long has this pull request spent in each phase of its lifecycle?

Data pending calculation for pull request

Author avatar

[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

elad335 reviewed on September 19, 2026

Resolved Comment Threads

No resolved comments have been left on this PR.