@Gareth Davidson for the NTFS patch, fable says the following -:
Problems to raise (line numbers are at PR head fe8346c)
1. Unbounded recursion in FindMFTAttrib, ntfs.c:693-701.
- If $MFT's base record has an attribute-list entry for $DATA but no $DATA attribute itself, the function calls itself until the stack is gone (27,000+ frames in the harness, at mount).
- Master with only the struct fix fails that image cleanly, so this is new.
- The data == NULL return on line 700 also leaks base_at's buffer.
- Suggested fix: have the bootstrap lookup walk only the base record and never enter the list.
2. Use-after-free for directories whose $INDEX_ROOT sits in an extension record, direntry.c:73-88.
- dh->idx_root points into emft_buf, which FreeMFTAttrib frees a few lines later; ProcessFSEntry then reads it.
- The code is old, but before this PR the attribute-list path never worked, so it is newly reachable.
- A 300-file directory with long names was enough to trigger it.
3. Cache_GetBlock still dereferences NULL on a failed read, cache.c:236.
- The PR's "report read failures" returns in ReadMFTAttribData are therefore never reached; an injected read error crashes instead.
- rom/filesys/fat/cache.c already has the guard: *data = b ? (b->data + data_offset) : NULL;.
4. Minor.
- The (UQUAD) cast for first_device_sector does nothing: the field, AccessDisk's num and BlockRange.num are all ULONG.
- A non-resident attribute list is only capped at 4 GB (ntfs.c:664); NTFS limits them to 256 KB.
- The AF_GPOS code is now dead.
- FindMFTAttrib and the read loop lost all their D(bug()) tracing and are much denser than the surrounding style.
- The PR title says "NFTS".