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:
@@ -12,4 +12,4 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#define MONTAUK_BUILD_NUMBER 19
|
||||
#define MONTAUK_BUILD_NUMBER 20
|
||||
|
||||
@@ -280,6 +280,14 @@ namespace Fs::Ramdisk {
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user