]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: Faccessat: use faccessat2 on linux
authorKir Kolyshkin <kolyshkin@gmail.com>
Thu, 30 Jun 2022 22:19:59 +0000 (15:19 -0700)
committerTobias Klauser <tobias.klauser@gmail.com>
Thu, 1 Sep 2022 22:00:28 +0000 (22:00 +0000)
Linux kernel 5.8 added the faccessat2 syscall taking a flags argument.
Attempt to use it in Faccessat and fall back to the existing
implementation mimicking glibc faccessat.

Do not export the new syscall value so we keep syscall API intact.

Part of this commit is generated by:

GOOS=linux ./mkall.sh -syscalls zsyscall_linux_*.go

This is similar to [1] amended by [2]. Required for [3].

[1] https://go-review.googlesource.com/c/sys/+/246537
[2] https://go-review.googlesource.com/c/sys/+/246817
[3] https://go-review.googlesource.com/c/go/+/414824

Co-authored-by: Tobias Klauser <tklauser@distanz.ch>
Change-Id: Ib7fe5ba853c15d92e869df9a16b56b79b96e43a6
Reviewed-on: https://go-review.googlesource.com/c/go/+/416115
Reviewed-by: Tobias Klauser <tobias.klauser@gmail.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Reviewed-by: Bryan Mills <bcmills@google.com>
24 files changed:
src/syscall/syscall_linux.go
src/syscall/syscall_linux_386.go
src/syscall/syscall_linux_amd64.go
src/syscall/syscall_linux_arm.go
src/syscall/syscall_linux_arm64.go
src/syscall/syscall_linux_loong64.go
src/syscall/syscall_linux_mips64x.go
src/syscall/syscall_linux_mipsx.go
src/syscall/syscall_linux_ppc64x.go
src/syscall/syscall_linux_riscv64.go
src/syscall/syscall_linux_s390x.go
src/syscall/zsyscall_linux_386.go
src/syscall/zsyscall_linux_amd64.go
src/syscall/zsyscall_linux_arm.go
src/syscall/zsyscall_linux_arm64.go
src/syscall/zsyscall_linux_loong64.go
src/syscall/zsyscall_linux_mips.go
src/syscall/zsyscall_linux_mips64.go
src/syscall/zsyscall_linux_mips64le.go
src/syscall/zsyscall_linux_mipsle.go
src/syscall/zsyscall_linux_ppc64.go
src/syscall/zsyscall_linux_ppc64le.go
src/syscall/zsyscall_linux_riscv64.go
src/syscall/zsyscall_linux_s390x.go

index 55a49cc3eb57e214e7c59793050a6582989ee700..c3038fc09ab977d6cb4e68f346e330a5a2bd3ea3 100644 (file)
@@ -137,10 +137,15 @@ func isGroupMember(gid int) bool {
 }
 
 //sys  faccessat(dirfd int, path string, mode uint32) (err error)
+//sys  faccessat2(dirfd int, path string, mode uint32, flags int) (err error) = _SYS_faccessat2
 
 func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) {
-       if flags & ^(_AT_SYMLINK_NOFOLLOW|_AT_EACCESS) != 0 {
-               return EINVAL
+       if flags == 0 {
+               return faccessat(dirfd, path, mode)
+       }
+
+       if err := faccessat2(dirfd, path, mode, flags); err != ENOSYS && err != EPERM {
+               return err
        }
 
        // The Linux kernel faccessat system call does not take any flags.
@@ -149,8 +154,8 @@ func Faccessat(dirfd int, path string, mode uint32, flags int) (err error) {
        // Because people naturally expect syscall.Faccessat to act
        // like C faccessat, we do the same.
 
-       if flags == 0 {
-               return faccessat(dirfd, path, mode)
+       if flags & ^(_AT_SYMLINK_NOFOLLOW|_AT_EACCESS) != 0 {
+               return EINVAL
        }
 
        var st Stat_t
index a8c29335179aaf022489434449c4bcd395d4f20b..76027369058f83a003140ebea37a7f53b314a5c8 100644 (file)
@@ -6,7 +6,10 @@ package syscall
 
 import "unsafe"
 
-const _SYS_setgroups = SYS_SETGROUPS32
+const (
+       _SYS_setgroups  = SYS_SETGROUPS32
+       _SYS_faccessat2 = 439
+)
 
 func setTimespec(sec, nsec int64) Timespec {
        return Timespec{Sec: int32(sec), Nsec: int32(nsec)}
index 229cf1ccf54dd8eeed1f71c49d94b06e8214ea04..02e411666e01a3055898f772e4bd3dc40b809d0a 100644 (file)
@@ -4,7 +4,10 @@
 
 package syscall
 
-const _SYS_setgroups = SYS_SETGROUPS
+const (
+       _SYS_setgroups  = SYS_SETGROUPS
+       _SYS_faccessat2 = 439
+)
 
 //sys  Dup2(oldfd int, newfd int) (err error)
 //sys  Fchown(fd int, uid int, gid int) (err error)
index f9f993bdfa83ddaf1314f930193a16bd7161201c..1b5d639ebe7e1ff2118d0a663c06c172edb093e6 100644 (file)
@@ -6,7 +6,10 @@ package syscall
 
 import "unsafe"
 
-const _SYS_setgroups = SYS_SETGROUPS32
+const (
+       _SYS_setgroups  = SYS_SETGROUPS32
+       _SYS_faccessat2 = 439
+)
 
 func setTimespec(sec, nsec int64) Timespec {
        return Timespec{Sec: int32(sec), Nsec: int32(nsec)}
index 6b482adcfd78c799ffb76f946aa5b971cdcb6b3a..3ce6849064b22b413996e93d63b77f0cc41b0cb6 100644 (file)
@@ -6,7 +6,10 @@ package syscall
 
 import "unsafe"
 
-const _SYS_setgroups = SYS_SETGROUPS
+const (
+       _SYS_setgroups  = SYS_SETGROUPS
+       _SYS_faccessat2 = 439
+)
 
 //sys  EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) = SYS_EPOLL_PWAIT
 //sys  Fchown(fd int, uid int, gid int) (err error)
index 531522089ea28247b2fe684abd1900cad88812ce..2cd349466822063dbcba83e2c5514ba50816917c 100644 (file)
@@ -6,7 +6,10 @@ package syscall
 
 import "unsafe"
 
-const _SYS_setgroups = SYS_SETGROUPS
+const (
+       _SYS_setgroups  = SYS_SETGROUPS
+       _SYS_faccessat2 = 439
+)
 
 //sys  EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) = SYS_EPOLL_PWAIT
 //sys  Fchown(fd int, uid int, gid int) (err error)
index 89b450b0508a57adcb6ac48b49d69ee7994af4ef..2d3784e7de45c0b363c91a807d84ad698df4ec1d 100644 (file)
@@ -6,7 +6,10 @@
 
 package syscall
 
-const _SYS_setgroups = SYS_SETGROUPS
+const (
+       _SYS_setgroups  = SYS_SETGROUPS
+       _SYS_faccessat2 = 5439
+)
 
 //sys  Dup2(oldfd int, newfd int) (err error)
 //sys  Fchown(fd int, uid int, gid int) (err error)
index 53c3a26469a0c454d7a008aa60ea23688118c984..59825e4a9837ad608f4bc0fe033955c9230c97af 100644 (file)
@@ -8,7 +8,10 @@ package syscall
 
 import "unsafe"
 
-const _SYS_setgroups = SYS_SETGROUPS
+const (
+       _SYS_setgroups  = SYS_SETGROUPS
+       _SYS_faccessat2 = 4439
+)
 
 func Syscall9(trap, a1, a2, a3, a4, a5, a6, a7, a8, a9 uintptr) (r1, r2 uintptr, err Errno)
 
index 5c20dfa8f64c08abb81ca9a8e769e9a18623e53d..ba8f1e78cf27d158ce1a5a351543261313041a9f 100644 (file)
@@ -6,7 +6,10 @@
 
 package syscall
 
-const _SYS_setgroups = SYS_SETGROUPS
+const (
+       _SYS_setgroups  = SYS_SETGROUPS
+       _SYS_faccessat2 = 439
+)
 
 //sys  Dup2(oldfd int, newfd int) (err error)
 //sys  EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
index 9a0de850a20ea77c1a8cbf1477d26883ba12e092..82c40941439a91b151f668dd0bc42aa5a364b441 100644 (file)
@@ -6,7 +6,10 @@ package syscall
 
 import "unsafe"
 
-const _SYS_setgroups = SYS_SETGROUPS
+const (
+       _SYS_setgroups  = SYS_SETGROUPS
+       _SYS_faccessat2 = 439
+)
 
 //sys  EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error) = SYS_EPOLL_PWAIT
 //sys  Fchown(fd int, uid int, gid int) (err error)
index 8e31385c0f530d5e6d47ea76baf41e53990b735f..fb97180483509a9be0e384fda98443d5472d1c23 100644 (file)
@@ -6,7 +6,10 @@ package syscall
 
 import "unsafe"
 
-const _SYS_setgroups = SYS_SETGROUPS
+const (
+       _SYS_setgroups  = SYS_SETGROUPS
+       _SYS_faccessat2 = 439
+)
 
 //sys  Dup2(oldfd int, newfd int) (err error)
 //sys  EpollWait(epfd int, events []EpollEvent, msec int) (n int, err error)
index 51af3b0f8d3a60de2035fe02d17450ba6fd9db8b..6a646fba4f5fc05cef912c1508ba1c94bd058139 100644 (file)
@@ -24,6 +24,21 @@ func faccessat(dirfd int, path string, mode uint32) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func faccessat2(dirfd int, path string, mode uint32, flags int) (err error) {
+       var _p0 *byte
+       _p0, err = BytePtrFromString(path)
+       if err != nil {
+               return
+       }
+       _, _, e1 := Syscall6(_SYS_faccessat2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func fchmodat(dirfd int, path string, mode uint32) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
index 8b0f952ed047260b5eddaab22920b406bbbb6733..d5b0099a9a70e289badfcfc5e3c8c8bdcd2f32ee 100644 (file)
@@ -24,6 +24,21 @@ func faccessat(dirfd int, path string, mode uint32) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func faccessat2(dirfd int, path string, mode uint32, flags int) (err error) {
+       var _p0 *byte
+       _p0, err = BytePtrFromString(path)
+       if err != nil {
+               return
+       }
+       _, _, e1 := Syscall6(_SYS_faccessat2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func fchmodat(dirfd int, path string, mode uint32) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
index 577655d002034f65a38674c47df14b32468f4539..db5ec6044822be91a1b60d106084b347685cfad2 100644 (file)
@@ -24,6 +24,21 @@ func faccessat(dirfd int, path string, mode uint32) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func faccessat2(dirfd int, path string, mode uint32, flags int) (err error) {
+       var _p0 *byte
+       _p0, err = BytePtrFromString(path)
+       if err != nil {
+               return
+       }
+       _, _, e1 := Syscall6(_SYS_faccessat2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func fchmodat(dirfd int, path string, mode uint32) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
index 1e19dcd22dd444b66f922cab211f2913aff8ef28..7655ccbb3d7935a125618caf112daf5458749a90 100644 (file)
@@ -24,6 +24,21 @@ func faccessat(dirfd int, path string, mode uint32) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func faccessat2(dirfd int, path string, mode uint32, flags int) (err error) {
+       var _p0 *byte
+       _p0, err = BytePtrFromString(path)
+       if err != nil {
+               return
+       }
+       _, _, e1 := Syscall6(_SYS_faccessat2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func fchmodat(dirfd int, path string, mode uint32) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
index b3d703d86b933b683383cd0b0f80bfff7b503925..abbc19be6046bf466015ddaa4c96d85cda2ee28a 100644 (file)
@@ -24,6 +24,21 @@ func faccessat(dirfd int, path string, mode uint32) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func faccessat2(dirfd int, path string, mode uint32, flags int) (err error) {
+       var _p0 *byte
+       _p0, err = BytePtrFromString(path)
+       if err != nil {
+               return
+       }
+       _, _, e1 := Syscall6(_SYS_faccessat2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func fchmodat(dirfd int, path string, mode uint32) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
index 3ffec82490401fba537b55a895bf0f9a5462f023..792668c1d5c3756df3727a0e008a168cf62015db 100644 (file)
@@ -24,6 +24,21 @@ func faccessat(dirfd int, path string, mode uint32) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func faccessat2(dirfd int, path string, mode uint32, flags int) (err error) {
+       var _p0 *byte
+       _p0, err = BytePtrFromString(path)
+       if err != nil {
+               return
+       }
+       _, _, e1 := Syscall6(_SYS_faccessat2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func fchmodat(dirfd int, path string, mode uint32) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
index bc3715016f3cc4513eea81576e5172ae8b62dbb4..27dbcb8a2d24a9e7cc6786522dcc149f40fd4efc 100644 (file)
@@ -24,6 +24,21 @@ func faccessat(dirfd int, path string, mode uint32) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func faccessat2(dirfd int, path string, mode uint32, flags int) (err error) {
+       var _p0 *byte
+       _p0, err = BytePtrFromString(path)
+       if err != nil {
+               return
+       }
+       _, _, e1 := Syscall6(_SYS_faccessat2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func fchmodat(dirfd int, path string, mode uint32) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
index de216cd614d82285edfec1755a2c83c23d505ac1..0362303c5f4ce40364ec754b0f895aff3f4e793c 100644 (file)
@@ -24,6 +24,21 @@ func faccessat(dirfd int, path string, mode uint32) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func faccessat2(dirfd int, path string, mode uint32, flags int) (err error) {
+       var _p0 *byte
+       _p0, err = BytePtrFromString(path)
+       if err != nil {
+               return
+       }
+       _, _, e1 := Syscall6(_SYS_faccessat2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func fchmodat(dirfd int, path string, mode uint32) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
index b41a3b33709222c3db8aaee6030430af7ea4b352..5320dfa65a7f53835cfa8179017788866dc72a00 100644 (file)
@@ -24,6 +24,21 @@ func faccessat(dirfd int, path string, mode uint32) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func faccessat2(dirfd int, path string, mode uint32, flags int) (err error) {
+       var _p0 *byte
+       _p0, err = BytePtrFromString(path)
+       if err != nil {
+               return
+       }
+       _, _, e1 := Syscall6(_SYS_faccessat2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func fchmodat(dirfd int, path string, mode uint32) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
index 7e9a3d7d8a9697cf542d3770fc67b9fac2f7d6f3..61f3063352c8719bd3e15dd04241c5d03366e543 100644 (file)
@@ -24,6 +24,21 @@ func faccessat(dirfd int, path string, mode uint32) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func faccessat2(dirfd int, path string, mode uint32, flags int) (err error) {
+       var _p0 *byte
+       _p0, err = BytePtrFromString(path)
+       if err != nil {
+               return
+       }
+       _, _, e1 := Syscall6(_SYS_faccessat2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func fchmodat(dirfd int, path string, mode uint32) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
index 12727cf1ea9d165feef4a1e9b997d03d4f0981b9..3e14ab37a1dfe1ee72de4069bf277e1654a8b0ae 100644 (file)
@@ -24,6 +24,21 @@ func faccessat(dirfd int, path string, mode uint32) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func faccessat2(dirfd int, path string, mode uint32, flags int) (err error) {
+       var _p0 *byte
+       _p0, err = BytePtrFromString(path)
+       if err != nil {
+               return
+       }
+       _, _, e1 := Syscall6(_SYS_faccessat2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func fchmodat(dirfd int, path string, mode uint32) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
index 702f7238462a7941bd1d7f1df18de2383f0865aa..4a3fa5dbd86b9163fe6e0abaad80c3c8d73d0d27 100644 (file)
@@ -24,6 +24,21 @@ func faccessat(dirfd int, path string, mode uint32) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func faccessat2(dirfd int, path string, mode uint32, flags int) (err error) {
+       var _p0 *byte
+       _p0, err = BytePtrFromString(path)
+       if err != nil {
+               return
+       }
+       _, _, e1 := Syscall6(_SYS_faccessat2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func fchmodat(dirfd int, path string, mode uint32) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)
index 65135e08976f59f0162f2433942c429b3f46f154..1fca71e3044511df36cf355715f0519c15e8fc7b 100644 (file)
@@ -24,6 +24,21 @@ func faccessat(dirfd int, path string, mode uint32) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
+func faccessat2(dirfd int, path string, mode uint32, flags int) (err error) {
+       var _p0 *byte
+       _p0, err = BytePtrFromString(path)
+       if err != nil {
+               return
+       }
+       _, _, e1 := Syscall6(_SYS_faccessat2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0)
+       if e1 != 0 {
+               err = errnoErr(e1)
+       }
+       return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func fchmodat(dirfd int, path string, mode uint32) (err error) {
        var _p0 *byte
        _p0, err = BytePtrFromString(path)