os: fix race condition in readdir by atomically initializing dirinfo

Signed-off-by: Amirhossein Akhlaghpour <m9.akhlaghpoor@gmail.com>
This commit is contained in:
Amirhossein Akhlaghpour 2025-01-31 15:53:13 +03:30
parent ce7ea0a6a5
commit eac6fc15cc
No known key found for this signature in database
GPG Key ID: D7A35F11FB70A961
1 changed files with 12 additions and 5 deletions

View File

@ -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()