aboutsummaryrefslogtreecommitdiff
path: root/src/os/root_unix.go
diff options
context:
space:
mode:
authorDamien Neil <dneil@google.com>2024-11-20 17:00:57 -0800
committerDamien Neil <dneil@google.com>2024-11-21 15:20:22 +0000
commit57147256e64a94f37219cb094c39efdd29dda2d6 (patch)
treed8e1f6fb2c44f5a92a2273374cf389a25273439e /src/os/root_unix.go
parent0a0a7a564271ab8acfe6210a6e1ca19e712e0d1f (diff)
downloadgo-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.go6
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.