From: database64128 Date: Thu, 21 Aug 2025 17:03:42 +0000 (+0800) Subject: [release-branch.go1.25] os: fix Root.MkdirAll to handle race of directory creation X-Git-Tag: go1.25.2~25 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=7d570090a9705a74127304cbe0d900fc1b813302;p=gostls13.git [release-branch.go1.25] os: fix Root.MkdirAll to handle race of directory creation No tests were added, because in order to reproduce, the directory would have to be created precisely between the rootOpenDir and mkdirat calls, which is impossible to do in a test. Fixes #75116 Change-Id: I6f86a5b33c87452c35728318eaf2169a7534ef37 Reviewed-on: https://go-review.googlesource.com/c/go/+/698215 LUCI-TryBot-Result: Go LUCI Reviewed-by: Sean Liao Reviewed-by: Damien Neil Reviewed-by: Carlos Amedee Auto-Submit: Sean Liao (cherry picked from commit a076f497577605e4cf0e20c147711e03dee7b2c3) Reviewed-on: https://go-review.googlesource.com/c/go/+/700655 Reviewed-by: Mark Freeman Reviewed-by: Michael Knyszek --- diff --git a/src/os/root_openat.go b/src/os/root_openat.go index e433bd5093..83bde5ef14 100644 --- a/src/os/root_openat.go +++ b/src/os/root_openat.go @@ -131,7 +131,9 @@ func rootMkdirAll(r *Root, fullname string, perm FileMode) error { if try > 0 || !IsNotExist(err) { return 0, &PathError{Op: "openat", Err: err} } - if err := mkdirat(parent, name, perm); err != nil { + // Try again on EEXIST, because the directory may have been created + // by another process or thread between the rootOpenDir and mkdirat calls. + if err := mkdirat(parent, name, perm); err != nil && err != syscall.EEXIST { return 0, &PathError{Op: "mkdirat", Err: err} } }