]> Cypherpunks repositories - gostls13.git/commitdiff
syscall: on linux-arm64, prefer prlimit to {g,s}etrlimit
authorIan Lance Taylor <iant@golang.org>
Tue, 28 Apr 2020 00:43:35 +0000 (17:43 -0700)
committerIan Lance Taylor <iant@golang.org>
Thu, 30 Apr 2020 03:32:25 +0000 (03:32 +0000)
Reportedly some Docker images accept the prlimit64 system call,
used by syscall.prlimit, but prohibit the getrlimit and setrlimit
system calls.

Fixes #38604

Change-Id: I91ff9370450b4869098cc8e335bbb7b863060508
Reviewed-on: https://go-review.googlesource.com/c/go/+/230339
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Tobias Klauser <tobias.klauser@gmail.com>
src/syscall/syscall_linux_arm64.go
src/syscall/zsyscall_linux_arm64.go

index 6d3b3dfde401a571c7c49e6fd1c0a72bba874772..1ad9dd8ea3d3a365f565d2182e6a7c89bbc2111c 100644 (file)
@@ -28,7 +28,7 @@ func EpollCreate(size int) (fd int, err error) {
 //sysnb        Getegid() (egid int)
 //sysnb        Geteuid() (euid int)
 //sysnb        Getgid() (gid int)
-//sysnb        Getrlimit(resource int, rlim *Rlimit) (err error)
+//sysnb        getrlimit(resource int, rlim *Rlimit) (err error)
 //sysnb        Getuid() (uid int)
 //sys  Listen(s int, n int) (err error)
 //sys  Pread(fd int, p []byte, offset int64) (n int, err error) = SYS_PREAD64
@@ -41,7 +41,7 @@ func EpollCreate(size int) (fd int, err error) {
 //sysnb        Setregid(rgid int, egid int) (err error)
 //sysnb        Setresgid(rgid int, egid int, sgid int) (err error)
 //sysnb        Setresuid(ruid int, euid int, suid int) (err error)
-//sysnb        Setrlimit(resource int, rlim *Rlimit) (err error)
+//sysnb        setrlimit(resource int, rlim *Rlimit) (err error)
 //sysnb        Setreuid(ruid int, euid int) (err error)
 //sys  Shutdown(fd int, how int) (err error)
 //sys  Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
@@ -171,6 +171,24 @@ func Pipe2(p []int, flags int) (err error) {
        return
 }
 
+// Getrlimit prefers the prlimit64 system call. See issue 38604.
+func Getrlimit(resource int, rlim *Rlimit) error {
+       err := prlimit(0, resource, nil, rlim)
+       if err != ENOSYS {
+               return err
+       }
+       return getrlimit(resource, rlim)
+}
+
+// Setrlimit prefers the prlimit64 system call. See issue 38604.
+func Setrlimit(resource int, rlim *Rlimit) error {
+       err := prlimit(0, resource, rlim, nil)
+       if err != ENOSYS {
+               return err
+       }
+       return setrlimit(resource, rlim)
+}
+
 func (r *PtraceRegs) PC() uint64 { return r.Pc }
 
 func (r *PtraceRegs) SetPC(pc uint64) { r.Pc = pc }
index b62383e703f81bbb909c63db2f0e8f585319ef24..f20f05e8d5779d205a9e76ada802158830d8fcf4 100644 (file)
@@ -1158,7 +1158,7 @@ func Getgid() (gid int) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Getrlimit(resource int, rlim *Rlimit) (err error) {
+func getrlimit(resource int, rlim *Rlimit) (err error) {
        _, _, e1 := RawSyscall(SYS_GETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
        if e1 != 0 {
                err = errnoErr(e1)
@@ -1312,7 +1312,7 @@ func Setresuid(ruid int, euid int, suid int) (err error) {
 
 // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
 
-func Setrlimit(resource int, rlim *Rlimit) (err error) {
+func setrlimit(resource int, rlim *Rlimit) (err error) {
        _, _, e1 := RawSyscall(SYS_SETRLIMIT, uintptr(resource), uintptr(unsafe.Pointer(rlim)), 0)
        if e1 != 0 {
                err = errnoErr(e1)