aboutsummaryrefslogtreecommitdiff
path: root/src/syscall/exec_libc.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/syscall/exec_libc.go')
-rw-r--r--src/syscall/exec_libc.go8
1 files changed, 8 insertions, 0 deletions
diff --git a/src/syscall/exec_libc.go b/src/syscall/exec_libc.go
index 0f8a7b5375..44557867eb 100644
--- a/src/syscall/exec_libc.go
+++ b/src/syscall/exec_libc.go
@@ -53,6 +53,7 @@ func getpid() (pid uintptr, err Errno)
func ioctl(fd uintptr, req uintptr, arg uintptr) (err Errno)
func setgid(gid uintptr) (err Errno)
func setgroups1(ngid uintptr, gid uintptr) (err Errno)
+func setrlimit1(which uintptr, lim unsafe.Pointer) (err Errno)
func setsid() (pid uintptr, err Errno)
func setuid(uid uintptr) (err Errno)
func setpgid(pid uintptr, pgid uintptr) (err Errno)
@@ -90,6 +91,8 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr
ngroups, groups uintptr
)
+ rlim, rlimOK := origRlimitNofile.Load().(Rlimit)
+
// guard against side effects of shuffling fds below.
// Make sure that nextfd is beyond any currently open files so
// that we can't run the risk of overwriting any of them.
@@ -292,6 +295,11 @@ func forkAndExecInChild(argv0 *byte, argv, envv []*byte, chroot, dir *byte, attr
}
}
+ // Restore original rlimit.
+ if rlimOK && rlim.Cur != 0 {
+ setrlimit1(RLIMIT_NOFILE, unsafe.Pointer(&rlim))
+ }
+
// Time to exec.
err1 = execve(
uintptr(unsafe.Pointer(argv0)),