From 7d570090a9705a74127304cbe0d900fc1b813302 Mon Sep 17 00:00:00 2001 From: database64128 Date: Fri, 22 Aug 2025 01:03:42 +0800 Subject: [PATCH] [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 --- src/os/root_openat.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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} } } -- 2.52.0