diff options
| author | Damien Neil <dneil@google.com> | 2024-11-20 17:00:57 -0800 |
|---|---|---|
| committer | Damien Neil <dneil@google.com> | 2024-11-21 15:20:22 +0000 |
| commit | 57147256e64a94f37219cb094c39efdd29dda2d6 (patch) | |
| tree | d8e1f6fb2c44f5a92a2273374cf389a25273439e /src/os/root_unix.go | |
| parent | 0a0a7a564271ab8acfe6210a6e1ca19e712e0d1f (diff) | |
| download | go-57147256e64a94f37219cb094c39efdd29dda2d6.tar.xz | |
os: recognize EFTYPE, EINVAL as a refusal to open a symlink
NetBSD returns EFTYPE when opening a symlink with O_NOFOLLOW.
Dragonfly seems to return EINVAL. Only check for EINVAL on Dragonfly,
since that seems like a bit of a broad net.
Change-Id: I031357816f1fe4c370373001207e65996087597f
Reviewed-on: https://go-review.googlesource.com/c/go/+/630396
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Diffstat (limited to 'src/os/root_unix.go')
| -rw-r--r-- | src/os/root_unix.go | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/src/os/root_unix.go b/src/os/root_unix.go index 568c47506e..4b52b81de7 100644 --- a/src/os/root_unix.go +++ b/src/os/root_unix.go @@ -61,7 +61,7 @@ func openRootInRoot(r *Root, name string) (*Root, error) { fd, err := doInRoot(r, name, func(parent int, name string) (fd int, err error) { ignoringEINTR(func() error { fd, err = unix.Openat(parent, name, syscall.O_NOFOLLOW|syscall.O_CLOEXEC, 0) - if err == syscall.ELOOP || err == syscall.EMLINK { + if isNoFollowErr(err) { err = checkSymlink(parent, name, err) } return err @@ -79,7 +79,7 @@ func rootOpenFileNolog(root *Root, name string, flag int, perm FileMode) (*File, fd, err := doInRoot(root, name, func(parent int, name string) (fd int, err error) { ignoringEINTR(func() error { fd, err = unix.Openat(parent, name, syscall.O_NOFOLLOW|syscall.O_CLOEXEC|flag, uint32(perm)) - if err == syscall.ELOOP || err == syscall.ENOTDIR || err == syscall.EMLINK { + if isNoFollowErr(err) || err == syscall.ENOTDIR { err = checkSymlink(parent, name, err) } return err @@ -100,7 +100,7 @@ func rootOpenDir(parent int, name string) (int, error) { ) ignoringEINTR(func() error { fd, err = unix.Openat(parent, name, syscall.O_NOFOLLOW|syscall.O_CLOEXEC|syscall.O_DIRECTORY, 0) - if err == syscall.ELOOP || err == syscall.ENOTDIR || err == syscall.EMLINK { + if isNoFollowErr(err) || err == syscall.ENOTDIR { err = checkSymlink(parent, name, err) } else if err == syscall.ENOTSUP || err == syscall.EOPNOTSUPP { // ENOTSUP and EOPNOTSUPP are often, but not always, the same errno. |
