fix: ramdisk ReadDir reports nonexistent paths as errors

ReadDirAt returned 0 (empty listing) for paths that do not exist at
all, so the libc's stat()/access() - which probe directory-ness via
SYS_READDIR - reported every nonexistent path as an existing
directory. Harmless for two years of callers, fatal for GCC's driver:
it access()-tests the optional specs file, got a false positive for
0:/sdk/lib/gcc/x86_64-montauk/14.2.0/specs, then died failing to read
it.

A path now has to have a directory entry or at least one child to
list as a directory; everything else returns -1. Real empty
directories (tar dir entries, runtime Mkdir) still list as empty.

Co-Authored-By: Claude Fable 5 <[email protected]>
This commit is contained in:
2026-07-17 10:10:31 +02:00
co-authored by Claude Fable 5
parent f234c67a2b
commit 3938530508
2 changed files with 9 additions and 1 deletions
+1 -1
View File
@@ -12,4 +12,4 @@
#pragma once #pragma once
#define MONTAUK_BUILD_NUMBER 19 #define MONTAUK_BUILD_NUMBER 20
+8
View File
@@ -280,6 +280,14 @@ namespace Fs::Ramdisk {
outNames[count++] = entryName; outNames[count++] = entryName;
} }
// A path with no directory entry and no children does not exist.
// Without this, ReadDir on a nonexistent path returned 0 (empty),
// which userspace stat()/access() misread as "directory exists" -
// fatal for GCC's driver, which access()-tests optional spec files.
if (count == 0 && seen == 0 && pathLen > 0 && selfIdx < 0) {
return -1;
}
return count; return count;
} }