A filesystem, and the guest read every file it asked for
fopen was the wall. The guest wanted
/app0/game.bin and ten .gnf textures - all of
them sitting in the title directory already. The files were never
missing; there was nothing to hand them over (D165).
Worth recording how the diagnosis went, because the tooling built
earlier today did all of it: the ordered call tail showed
fopen followed by fseek(0x7fff0001), which is
our own error code being carried around as a FILE *. Then
reading the path string straight out of the module showed exactly which
files it wanted.
No stub value works here. Unimplemented,
fopen answered an error code and the guest carried it
through four more calls, sizing a two gigabyte allocation from the
nonsense ftell returned. Declared as pointer-returning it
answered null, and the guest read offset four of the null and faulted at
the identical address. It does not check. Third subsystem to land on
this - handles must be backed by real memory - and it should stop being
a discovery each time.
orbistoun-fs now has a mount table and an open-file
table. /app0 maps to the title's directory,
read-only, because a guest writing through it would be
writing into the user's own dumped title. Escapes are refused by walking
components rather than resolving first: a guest chooses these
strings.
| before | after | |
|---|---|---|
| imports | 41 | 47 |
| calls | 790 | 932 |
| files opened | 0 | 10 |
| largest allocation | 2 GiB, from garbage | 128 MiB, from a real ftell |
Then the next fault named its own cause -
write to 0x7fff0019, our error code plus 0x18. Candidate
names against the hash confirmed _Znwm, C++
operator new. Wired to the existing heap; a program mixing
new and malloc must see one heap.
Now at sceSysmoduleLoadModule returning an error the
guest dereferences. Same pattern again, different function.