Commit 760ac1dd authored by Tobias Klauser's avatar Tobias Klauser Committed by Tobias Klauser

os: make RemoveAll("") fail silently on unix

CL 146020 changed the behavior of RemoveAll("") on unix systems using
the *at functions to return syscall.EINVAL instead of nil. Adjust the
*at implementation to retain this behavior as is the case on the *noat
systems.

Additionally, also make sure RemoveAll("") on systems not using the "at
functions (e.g. nacl and js/wasm) follow the same behavior (which wasn't
the case previously).

Fixes #28830

Change-Id: I8383c1423fefe871d18ff49134a1d23077ec6867
Reviewed-on: https://go-review.googlesource.com/c/150158
Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com>
Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: 's avatarroger peppe <rogpeppe@gmail.com>
parent 5001a38c
...@@ -13,8 +13,14 @@ import ( ...@@ -13,8 +13,14 @@ import (
) )
func RemoveAll(path string) error { func RemoveAll(path string) error {
if path == "" {
// fail silently to retain compatibility with previous behavior
// of RemoveAll. See issue 28830.
return nil
}
// Not allowed in unix // Not allowed in unix
if path == "" || endsWithDot(path) { if endsWithDot(path) {
return syscall.EINVAL return syscall.EINVAL
} }
......
...@@ -16,6 +16,12 @@ import ( ...@@ -16,6 +16,12 @@ import (
// it encounters. If the path does not exist, RemoveAll // it encounters. If the path does not exist, RemoveAll
// returns nil (no error). // returns nil (no error).
func RemoveAll(path string) error { func RemoveAll(path string) error {
if path == "" {
// fail silently to retain compatibility with previous behavior
// of RemoveAll. See issue 28830.
return nil
}
// Simple case: if Remove works, we're done. // Simple case: if Remove works, we're done.
err := Remove(path) err := Remove(path)
if err == nil || IsNotExist(err) { if err == nil || IsNotExist(err) {
......
...@@ -21,6 +21,10 @@ func TestRemoveAll(t *testing.T) { ...@@ -21,6 +21,10 @@ func TestRemoveAll(t *testing.T) {
} }
defer RemoveAll(tmpDir) defer RemoveAll(tmpDir)
if err := RemoveAll(""); err != nil {
t.Errorf("RemoveAll(\"\"): %v; want nil", err)
}
file := filepath.Join(tmpDir, "file") file := filepath.Join(tmpDir, "file")
path := filepath.Join(tmpDir, "_TestRemoveAll_") path := filepath.Join(tmpDir, "_TestRemoveAll_")
fpath := filepath.Join(path, "file") fpath := filepath.Join(path, "file")
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment