Skip to content

Commit ff18efa

Browse files
ianlancetaylorgopherbot
authored andcommitted
unix: change Setrlimit/Prlimit to always call syscall functions
As of Go 1.21 syscall.Setrlimit and syscall.prlimit can affect starting a new process, by restoring the original NOFILE rlimit. That is recorded locally in the syscall package, so just always call the syscall functions. For golang/go#46279 Change-Id: I2f3dafe5562a7dde1297bad6f5d34a80af5d620b Reviewed-on: https://go-review.googlesource.com/c/sys/+/476695 Run-TryBot: Ian Lance Taylor <iant@golang.org> Run-TryBot: Ian Lance Taylor <iant@google.com> Reviewed-by: Ian Lance Taylor <iant@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Bryan Mills <bcmills@google.com> Auto-Submit: Ian Lance Taylor <iant@google.com>
1 parent 494aa49 commit ff18efa

File tree

72 files changed

+17
-618
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

72 files changed

+17
-618
lines changed

unix/darwin_amd64_test.go

-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

unix/darwin_arm64_test.go

-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

unix/syscall_aix_ppc.go

-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
package unix
99

1010
//sysnb Getrlimit(resource int, rlim *Rlimit) (err error) = getrlimit64
11-
//sysnb Setrlimit(resource int, rlim *Rlimit) (err error) = setrlimit64
1211
//sys Seek(fd int, offset int64, whence int) (off int64, err error) = lseek64
1312

1413
//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error)

unix/syscall_aix_ppc64.go

-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
package unix
99

1010
//sysnb Getrlimit(resource int, rlim *Rlimit) (err error)
11-
//sysnb Setrlimit(resource int, rlim *Rlimit) (err error)
1211
//sys Seek(fd int, offset int64, whence int) (off int64, err error) = lseek
1312

1413
//sys mmap(addr uintptr, length uintptr, prot int, flags int, fd int, offset int64) (xaddr uintptr, err error) = mmap64

unix/syscall_darwin.go

-1
Original file line numberDiff line numberDiff line change
@@ -622,7 +622,6 @@ func SysctlKinfoProcSlice(name string, args ...int) ([]KinfoProc, error) {
622622
//sys Setprivexec(flag int) (err error)
623623
//sysnb Setregid(rgid int, egid int) (err error)
624624
//sysnb Setreuid(ruid int, euid int) (err error)
625-
//sysnb Setrlimit(which int, lim *Rlimit) (err error)
626625
//sysnb Setsid() (pid int, err error)
627626
//sysnb Settimeofday(tp *Timeval) (err error)
628627
//sysnb Setuid(uid int) (err error)

unix/syscall_dragonfly.go

-1
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,6 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
326326
//sysnb Setreuid(ruid int, euid int) (err error)
327327
//sysnb Setresgid(rgid int, egid int, sgid int) (err error)
328328
//sysnb Setresuid(ruid int, euid int, suid int) (err error)
329-
//sysnb Setrlimit(which int, lim *Rlimit) (err error)
330329
//sysnb Setsid() (pid int, err error)
331330
//sysnb Settimeofday(tp *Timeval) (err error)
332331
//sysnb Setuid(uid int) (err error)

unix/syscall_freebsd.go

-1
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,6 @@ func Dup3(oldfd, newfd, flags int) error {
433433
//sysnb Setreuid(ruid int, euid int) (err error)
434434
//sysnb Setresgid(rgid int, egid int, sgid int) (err error)
435435
//sysnb Setresuid(ruid int, euid int, suid int) (err error)
436-
//sysnb Setrlimit(which int, lim *Rlimit) (err error)
437436
//sysnb Setsid() (pid int, err error)
438437
//sysnb Settimeofday(tp *Timeval) (err error)
439438
//sysnb Setuid(uid int) (err error)

unix/syscall_linux.go

+9-1
Original file line numberDiff line numberDiff line change
@@ -1873,7 +1873,6 @@ func Getpgrp() (pid int) {
18731873
//sys OpenTree(dfd int, fileName string, flags uint) (r int, err error)
18741874
//sys PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error)
18751875
//sys PivotRoot(newroot string, putold string) (err error) = SYS_PIVOT_ROOT
1876-
//sysnb Prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) = SYS_PRLIMIT64
18771876
//sys Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error)
18781877
//sys Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) = SYS_PSELECT6
18791878
//sys read(fd int, p []byte) (n int, err error)
@@ -1887,6 +1886,15 @@ func Getpgrp() (pid int) {
18871886
//sysnb Settimeofday(tv *Timeval) (err error)
18881887
//sys Setns(fd int, nstype int) (err error)
18891888

1889+
//go:linkname syscall_prlimit syscall.prlimit
1890+
func syscall_prlimit(pid, resource int, newlimit, old *syscall.Rlimit) error
1891+
1892+
func Prlimit(pid, resource int, newlimit, old *Rlimit) error {
1893+
// Just call the syscall version, because as of Go 1.21
1894+
// it will affect starting a new process.
1895+
return syscall_prlimit(pid, resource, (*syscall.Rlimit)(newlimit), (*syscall.Rlimit)(old))
1896+
}
1897+
18901898
// PrctlRetInt performs a prctl operation specified by option and further
18911899
// optional arguments arg2 through arg5 depending on option. It returns a
18921900
// non-negative integer that is returned by the prctl syscall.

unix/syscall_linux_386.go

-27
Original file line numberDiff line numberDiff line change
@@ -97,33 +97,6 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) {
9797
return
9898
}
9999

100-
//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT
101-
102-
func Setrlimit(resource int, rlim *Rlimit) (err error) {
103-
err = Prlimit(0, resource, rlim, nil)
104-
if err != ENOSYS {
105-
return err
106-
}
107-
108-
rl := rlimit32{}
109-
if rlim.Cur == rlimInf64 {
110-
rl.Cur = rlimInf32
111-
} else if rlim.Cur < uint64(rlimInf32) {
112-
rl.Cur = uint32(rlim.Cur)
113-
} else {
114-
return EINVAL
115-
}
116-
if rlim.Max == rlimInf64 {
117-
rl.Max = rlimInf32
118-
} else if rlim.Max < uint64(rlimInf32) {
119-
rl.Max = uint32(rlim.Max)
120-
} else {
121-
return EINVAL
122-
}
123-
124-
return setrlimit(resource, &rl)
125-
}
126-
127100
func Seek(fd int, offset int64, whence int) (newoffset int64, err error) {
128101
newoffset, errno := seek(fd, offset, whence)
129102
if errno != 0 {

unix/syscall_linux_amd64.go

-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err
4646
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
4747
//sys setfsgid(gid int) (prev int, err error)
4848
//sys setfsuid(uid int) (prev int, err error)
49-
//sysnb Setrlimit(resource int, rlim *Rlimit) (err error)
5049
//sys Shutdown(fd int, how int) (err error)
5150
//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
5251

unix/syscall_linux_arm.go

-27
Original file line numberDiff line numberDiff line change
@@ -171,33 +171,6 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) {
171171
return
172172
}
173173

174-
//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT
175-
176-
func Setrlimit(resource int, rlim *Rlimit) (err error) {
177-
err = Prlimit(0, resource, rlim, nil)
178-
if err != ENOSYS {
179-
return err
180-
}
181-
182-
rl := rlimit32{}
183-
if rlim.Cur == rlimInf64 {
184-
rl.Cur = rlimInf32
185-
} else if rlim.Cur < uint64(rlimInf32) {
186-
rl.Cur = uint32(rlim.Cur)
187-
} else {
188-
return EINVAL
189-
}
190-
if rlim.Max == rlimInf64 {
191-
rl.Max = rlimInf32
192-
} else if rlim.Max < uint64(rlimInf32) {
193-
rl.Max = uint32(rlim.Max)
194-
} else {
195-
return EINVAL
196-
}
197-
198-
return setrlimit(resource, &rl)
199-
}
200-
201174
func (r *PtraceRegs) PC() uint64 { return uint64(r.Uregs[15]) }
202175

203176
func (r *PtraceRegs) SetPC(pc uint64) { r.Uregs[15] = uint32(pc) }

unix/syscall_linux_arm64.go

-10
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err
3939
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
4040
//sys setfsgid(gid int) (prev int, err error)
4141
//sys setfsuid(uid int) (prev int, err error)
42-
//sysnb setrlimit(resource int, rlim *Rlimit) (err error)
4342
//sys Shutdown(fd int, how int) (err error)
4443
//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
4544

@@ -143,15 +142,6 @@ func Getrlimit(resource int, rlim *Rlimit) error {
143142
return getrlimit(resource, rlim)
144143
}
145144

146-
// Setrlimit prefers the prlimit64 system call. See issue 38604.
147-
func Setrlimit(resource int, rlim *Rlimit) error {
148-
err := Prlimit(0, resource, rlim, nil)
149-
if err != ENOSYS {
150-
return err
151-
}
152-
return setrlimit(resource, rlim)
153-
}
154-
155145
func (r *PtraceRegs) PC() uint64 { return r.Pc }
156146

157147
func (r *PtraceRegs) SetPC(pc uint64) { r.Pc = pc }

unix/syscall_linux_loong64.go

-5
Original file line numberDiff line numberDiff line change
@@ -126,11 +126,6 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) {
126126
return
127127
}
128128

129-
func Setrlimit(resource int, rlim *Rlimit) (err error) {
130-
err = Prlimit(0, resource, rlim, nil)
131-
return
132-
}
133-
134129
func futimesat(dirfd int, path string, tv *[2]Timeval) (err error) {
135130
if tv == nil {
136131
return utimensat(dirfd, path, nil, 0)

unix/syscall_linux_mips64x.go

-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err
3737
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
3838
//sys setfsgid(gid int) (prev int, err error)
3939
//sys setfsuid(uid int) (prev int, err error)
40-
//sysnb Setrlimit(resource int, rlim *Rlimit) (err error)
4140
//sys Shutdown(fd int, how int) (err error)
4241
//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
4342
//sys Statfs(path string, buf *Statfs_t) (err error)

unix/syscall_linux_mipsx.go

-27
Original file line numberDiff line numberDiff line change
@@ -151,33 +151,6 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) {
151151
return
152152
}
153153

154-
//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT
155-
156-
func Setrlimit(resource int, rlim *Rlimit) (err error) {
157-
err = Prlimit(0, resource, rlim, nil)
158-
if err != ENOSYS {
159-
return err
160-
}
161-
162-
rl := rlimit32{}
163-
if rlim.Cur == rlimInf64 {
164-
rl.Cur = rlimInf32
165-
} else if rlim.Cur < uint64(rlimInf32) {
166-
rl.Cur = uint32(rlim.Cur)
167-
} else {
168-
return EINVAL
169-
}
170-
if rlim.Max == rlimInf64 {
171-
rl.Max = rlimInf32
172-
} else if rlim.Max < uint64(rlimInf32) {
173-
rl.Max = uint32(rlim.Max)
174-
} else {
175-
return EINVAL
176-
}
177-
178-
return setrlimit(resource, &rl)
179-
}
180-
181154
func (r *PtraceRegs) PC() uint64 { return r.Epc }
182155

183156
func (r *PtraceRegs) SetPC(pc uint64) { r.Epc = pc }

unix/syscall_linux_ppc.go

-27
Original file line numberDiff line numberDiff line change
@@ -159,33 +159,6 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) {
159159
return
160160
}
161161

162-
//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT
163-
164-
func Setrlimit(resource int, rlim *Rlimit) (err error) {
165-
err = Prlimit(0, resource, rlim, nil)
166-
if err != ENOSYS {
167-
return err
168-
}
169-
170-
rl := rlimit32{}
171-
if rlim.Cur == rlimInf64 {
172-
rl.Cur = rlimInf32
173-
} else if rlim.Cur < uint64(rlimInf32) {
174-
rl.Cur = uint32(rlim.Cur)
175-
} else {
176-
return EINVAL
177-
}
178-
if rlim.Max == rlimInf64 {
179-
rl.Max = rlimInf32
180-
} else if rlim.Max < uint64(rlimInf32) {
181-
rl.Max = uint32(rlim.Max)
182-
} else {
183-
return EINVAL
184-
}
185-
186-
return setrlimit(resource, &rl)
187-
}
188-
189162
func (r *PtraceRegs) PC() uint32 { return r.Nip }
190163

191164
func (r *PtraceRegs) SetPC(pc uint32) { r.Nip = pc }

unix/syscall_linux_ppc64x.go

-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ package unix
3434
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
3535
//sys setfsgid(gid int) (prev int, err error)
3636
//sys setfsuid(uid int) (prev int, err error)
37-
//sysnb Setrlimit(resource int, rlim *Rlimit) (err error)
3837
//sys Shutdown(fd int, how int) (err error)
3938
//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
4039
//sys Stat(path string, stat *Stat_t) (err error)

unix/syscall_linux_riscv64.go

-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err
3838
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
3939
//sys setfsgid(gid int) (prev int, err error)
4040
//sys setfsuid(uid int) (prev int, err error)
41-
//sysnb Setrlimit(resource int, rlim *Rlimit) (err error)
4241
//sys Shutdown(fd int, how int) (err error)
4342
//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
4443

unix/syscall_linux_s390x.go

-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ import (
3434
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
3535
//sys setfsgid(gid int) (prev int, err error)
3636
//sys setfsuid(uid int) (prev int, err error)
37-
//sysnb Setrlimit(resource int, rlim *Rlimit) (err error)
3837
//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
3938
//sys Stat(path string, stat *Stat_t) (err error)
4039
//sys Statfs(path string, buf *Statfs_t) (err error)

unix/syscall_linux_sparc64.go

-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ package unix
3131
//sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error)
3232
//sys setfsgid(gid int) (prev int, err error)
3333
//sys setfsuid(uid int) (prev int, err error)
34-
//sysnb Setrlimit(resource int, rlim *Rlimit) (err error)
3534
//sys Shutdown(fd int, how int) (err error)
3635
//sys Splice(rfd int, roff *int64, wfd int, woff *int64, len int, flags int) (n int64, err error)
3736
//sys Stat(path string, stat *Stat_t) (err error)

unix/syscall_netbsd.go

-2
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,6 @@ func Statvfs(path string, buf *Statvfs_t) (err error) {
340340
//sys Setpriority(which int, who int, prio int) (err error)
341341
//sysnb Setregid(rgid int, egid int) (err error)
342342
//sysnb Setreuid(ruid int, euid int) (err error)
343-
//sysnb Setrlimit(which int, lim *Rlimit) (err error)
344343
//sysnb Setsid() (pid int, err error)
345344
//sysnb Settimeofday(tp *Timeval) (err error)
346345
//sysnb Setuid(uid int) (err error)
@@ -501,7 +500,6 @@ func Statvfs(path string, buf *Statvfs_t) (err error) {
501500
// compat_43_osendmsg
502501
// compat_43_osethostid
503502
// compat_43_osethostname
504-
// compat_43_osetrlimit
505503
// compat_43_osigblock
506504
// compat_43_osigsetmask
507505
// compat_43_osigstack

unix/syscall_openbsd.go

-1
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,6 @@ func Uname(uname *Utsname) error {
294294
//sysnb Setreuid(ruid int, euid int) (err error)
295295
//sysnb Setresgid(rgid int, egid int, sgid int) (err error)
296296
//sysnb Setresuid(ruid int, euid int, suid int) (err error)
297-
//sysnb Setrlimit(which int, lim *Rlimit) (err error)
298297
//sysnb Setrtable(rtable int) (err error)
299298
//sysnb Setsid() (pid int, err error)
300299
//sysnb Settimeofday(tp *Timeval) (err error)

unix/syscall_solaris.go

-1
Original file line numberDiff line numberDiff line change
@@ -665,7 +665,6 @@ func Sendfile(outfd int, infd int, offset *int64, count int) (written int, err e
665665
//sys Setpriority(which int, who int, prio int) (err error)
666666
//sysnb Setregid(rgid int, egid int) (err error)
667667
//sysnb Setreuid(ruid int, euid int) (err error)
668-
//sysnb Setrlimit(which int, lim *Rlimit) (err error)
669668
//sysnb Setsid() (pid int, err error)
670669
//sysnb Setuid(uid int) (err error)
671670
//sys Shutdown(s int, how int) (err error) = libsocket.shutdown

unix/syscall_unix.go

+7
Original file line numberDiff line numberDiff line change
@@ -587,3 +587,10 @@ func emptyIovecs(iov []Iovec) bool {
587587
}
588588
return true
589589
}
590+
591+
// Setrlimit sets a resource limit.
592+
func Setrlimit(resource int, rlim *Rlimit) error {
593+
// Just call the syscall version, because as of Go 1.21
594+
// it will affect starting a new process.
595+
return syscall.Setrlimit(resource, (*syscall.Rlimit)(rlim))
596+
}

unix/zsyscall_aix_ppc.go

-11
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

unix/zsyscall_aix_ppc64.go

-10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)