From: David du Colombier <0intro@gmail.com> Date: Wed, 21 Nov 2018 23:06:42 +0000 (+0100) Subject: os: prevent RemoveAll to remove "." on Plan 9 X-Git-Tag: go1.12beta1~287 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=47df645473210267fd7512c5b92de00908198974;p=gostls13.git os: prevent RemoveAll to remove "." on Plan 9 CL 150497 enabled TestRemoveAllDot on "noat" systems. However, this test is failing on Plan 9 because the rmdir system call allows to remove "." on Plan 9. This change prevents the "noat" implementation of RemoveAll to remove ".", so it remains consistent with the "at" implementation. Fixes #28903. Change-Id: Ifc8fe36bdd8053a4e416f0590663c844c97ce72a Reviewed-on: https://go-review.googlesource.com/c/150621 Run-TryBot: David du Colombier <0intro@gmail.com> TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- diff --git a/src/os/path.go b/src/os/path.go index e31f64c750..30cc6c8b98 100644 --- a/src/os/path.go +++ b/src/os/path.go @@ -57,3 +57,14 @@ func MkdirAll(path string, perm FileMode) error { } return nil } + +// endsWithDot reports whether the final component of path is ".". +func endsWithDot(path string) bool { + if path == "." { + return true + } + if len(path) >= 2 && path[len(path)-1] == '.' && IsPathSeparator(path[len(path)-2]) { + return true + } + return false +} diff --git a/src/os/removeall_at.go b/src/os/removeall_at.go index 777690ec66..c42319a831 100644 --- a/src/os/removeall_at.go +++ b/src/os/removeall_at.go @@ -130,14 +130,3 @@ func openFdAt(fd int, path string) (*File, error) { return NewFile(uintptr(fd), path), nil } - -// endsWithDot returns whether the final component of path is ".". -func endsWithDot(path string) bool { - if path == "." { - return true - } - if len(path) >= 2 && path[len(path)-1] == '.' && IsPathSeparator(path[len(path)-2]) { - return true - } - return false -} diff --git a/src/os/removeall_noat.go b/src/os/removeall_noat.go index d382b42af3..80527e227c 100644 --- a/src/os/removeall_noat.go +++ b/src/os/removeall_noat.go @@ -22,6 +22,13 @@ func RemoveAll(path string) error { return nil } + // The rmdir system call permits removing "." on Plan 9, + // so we don't permit it to remain consistent with the + // "at" implementation of RemoveAll. + if endsWithDot(path) { + return &PathError{"RemoveAll", path, syscall.EINVAL} + } + // Simple case: if Remove works, we're done. err := Remove(path) if err == nil || IsNotExist(err) {