From 8f83d009ef0320fd3fe7cf03e55d5d24df57f015 Mon Sep 17 00:00:00 2001 From: Dave Vasilevsky Date: Mon, 24 Nov 2025 22:04:34 -0500 Subject: [PATCH] os: allow direntries to have zero inodes on Linux While such entries have often been skipped, some Linux filesystems return valid enties with zero inodes. This new behavior also puts Go in agreement with recent glibc. Fixes #76428 --- src/os/dir_unix.go | 3 ++- src/syscall/dirent.go | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/os/dir_unix.go b/src/os/dir_unix.go index 6a0135b70b0..87df3122d4e 100644 --- a/src/os/dir_unix.go +++ b/src/os/dir_unix.go @@ -112,7 +112,8 @@ func (f *File) readdir(n int, mode readdirMode) (names []string, dirents []DirEn // or might expose a remote file system which does not have the concept // of inodes. Therefore, we cannot make the assumption that it is safe // to skip entries with zero inodes. - if ino == 0 && runtime.GOOS != "wasip1" { + // Some Linux filesystems (old XFS, FUSE) can return valid files with zero inodes. + if ino == 0 && runtime.GOOS != "linux" && runtime.GOOS != "wasip1" { continue } const namoff = uint64(unsafe.Offsetof(syscall.Dirent{}.Name)) diff --git a/src/syscall/dirent.go b/src/syscall/dirent.go index c12b1193356..00946412703 100644 --- a/src/syscall/dirent.go +++ b/src/syscall/dirent.go @@ -73,8 +73,8 @@ func ParseDirent(buf []byte, max int, names []string) (consumed int, count int, break } // See src/os/dir_unix.go for the reason why this condition is - // excluded on wasip1. - if ino == 0 && runtime.GOOS != "wasip1" { // File absent in directory. + // excluded on wasip1 and linux. + if ino == 0 && runtime.GOOS != "linux" && runtime.GOOS != "wasip1" { // File absent in directory. continue } const namoff = uint64(unsafe.Offsetof(Dirent{}.Name))