From eac6fc15cc83446c12b77c7eacfa0ba7ba478158 Mon Sep 17 00:00:00 2001 From: Amirhossein Akhlaghpour Date: Fri, 31 Jan 2025 15:53:13 +0330 Subject: [PATCH] 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 ab5c1efce5..9d28bd7dda 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()