Skip to content

Commit 5852760

Browse files
peterGorsc
authored andcommitted
syscall: prlimit argument error for Getrlimit and Setrlimit on Linux 32-bit
The rlimit arguments for prlimit are reversed for linux 32-bit (386 and arm). Getrlimit becomes Setrlimit and vice versa. Fixes #5949. R=iant, mikioh.mikioh, rsc CC=golang-dev https://golang.org/cl/11803043
1 parent d9d3deb commit 5852760

File tree

3 files changed

+45
-4
lines changed

3 files changed

+45
-4
lines changed

src/pkg/syscall/rlimit_linux_test.go

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// Copyright 2013 The Go Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style
3+
// license that can be found in the LICENSE file.
4+
5+
package syscall_test
6+
7+
import (
8+
"syscall"
9+
"testing"
10+
)
11+
12+
func TestRlimit(t *testing.T) {
13+
var rlimit, zero syscall.Rlimit
14+
err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rlimit)
15+
if err != nil {
16+
t.Fatalf("Getrlimit: save failed: %v", err)
17+
}
18+
if zero == rlimit {
19+
t.Fatalf("Getrlimit: save failed: got zero value %#v", rlimit)
20+
}
21+
set := rlimit
22+
set.Cur = set.Max - 1
23+
err = syscall.Setrlimit(syscall.RLIMIT_NOFILE, &set)
24+
if err != nil {
25+
t.Fatalf("Setrlimit: set failed: %#v %v", set, err)
26+
}
27+
var get syscall.Rlimit
28+
err = syscall.Getrlimit(syscall.RLIMIT_NOFILE, &get)
29+
if err != nil {
30+
t.Fatalf("Getrlimit: get failed: %v", err)
31+
}
32+
set = rlimit
33+
set.Cur = set.Max - 1
34+
if set != get {
35+
t.Fatalf("Rlimit: change failed: wanted %#v got %#v", set, get)
36+
}
37+
err = syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rlimit)
38+
if err != nil {
39+
t.Fatalf("Setrlimit: restore failed: %#v %v", rlimit, err)
40+
}
41+
}

src/pkg/syscall/syscall_linux_386.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ const rlimInf32 = ^uint32(0)
7878
const rlimInf64 = ^uint64(0)
7979

8080
func Getrlimit(resource int, rlim *Rlimit) (err error) {
81-
err = prlimit(0, resource, rlim, nil)
81+
err = prlimit(0, resource, nil, rlim)
8282
if err != ENOSYS {
8383
return err
8484
}
@@ -106,7 +106,7 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) {
106106
//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT
107107

108108
func Setrlimit(resource int, rlim *Rlimit) (err error) {
109-
err = prlimit(0, resource, nil, rlim)
109+
err = prlimit(0, resource, rlim, nil)
110110
if err != ENOSYS {
111111
return err
112112
}

src/pkg/syscall/syscall_linux_arm.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ const rlimInf32 = ^uint32(0)
119119
const rlimInf64 = ^uint64(0)
120120

121121
func Getrlimit(resource int, rlim *Rlimit) (err error) {
122-
err = prlimit(0, resource, rlim, nil)
122+
err = prlimit(0, resource, nil, rlim)
123123
if err != ENOSYS {
124124
return err
125125
}
@@ -147,7 +147,7 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) {
147147
//sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT
148148

149149
func Setrlimit(resource int, rlim *Rlimit) (err error) {
150-
err = prlimit(0, resource, nil, rlim)
150+
err = prlimit(0, resource, rlim, nil)
151151
if err != ENOSYS {
152152
return err
153153
}

0 commit comments

Comments
 (0)