From eac6fc15cc83446c12b77c7eacfa0ba7ba478158 Mon Sep 17 00:00:00 2001 From: Amirhossein Akhlaghpour Date: Fri, 31 Jan 2025 15:53:13 +0330 Subject: [PATCH 1/2] os: fix race condition in readdir by atomically initializing dirinfo Signed-off-by: Amirhossein Akhlaghpour --- src/os/dir_plan9.go | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/os/dir_plan9.go b/src/os/dir_plan9.go index ab5c1efce5b075..9d28bd7dda4a89 100644 --- a/src/os/dir_plan9.go +++ b/src/os/dir_plan9.go @@ -11,12 +11,19 @@ import ( ) func (file *File) readdir(n int, mode readdirMode) (names []string, dirents []DirEntry, infos []FileInfo, err error) { - // If this file has no dirinfo, create one. - d := file.dirinfo.Load() - if d == nil { - d = new(dirInfo) - file.dirinfo.Store(d) + var d *dirInfo + for { + d = file.dirinfo.Load() + if d != nil { + break + } + newD := new(dirInfo) + if file.dirinfo.CompareAndSwap(nil, newD) { + d = newD + break + } } + d.mu.Lock() defer d.mu.Unlock() From 1e1f6191439cf3ad32f3ba54bba5a0185dd55b14 Mon Sep 17 00:00:00 2001 From: Amirhossein Akhlaghpour Date: Sat, 1 Feb 2025 09:58:19 +0330 Subject: [PATCH 2/2] os: fix the race condition on dir_unix Signed-off-by: Amirhossein Akhlaghpour --- src/os/dir_unix.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/os/dir_unix.go b/src/os/dir_unix.go index eadc1660c212ea..6a0135b70b073b 100644 --- a/src/os/dir_unix.go +++ b/src/os/dir_unix.go @@ -46,11 +46,19 @@ func (d *dirInfo) close() { func (f *File) readdir(n int, mode readdirMode) (names []string, dirents []DirEntry, infos []FileInfo, err error) { // If this file has no dirInfo, create one. - d := f.dirinfo.Load() - if d == nil { - d = new(dirInfo) - f.dirinfo.Store(d) + var d *dirInfo + for { + d = f.dirinfo.Load() + if d != nil { + break + } + newD := new(dirInfo) + if f.dirinfo.CompareAndSwap(nil, newD) { + d = newD + break + } } + d.mu.Lock() defer d.mu.Unlock() if d.buf == nil {