aboutsummaryrefslogtreecommitdiffstats
path: root/sys/openbsd
diff options
context:
space:
mode:
Diffstat (limited to 'sys/openbsd')
-rw-r--r--sys/openbsd/init.go36
-rw-r--r--sys/openbsd/init_test.go5
2 files changed, 32 insertions, 9 deletions
diff --git a/sys/openbsd/init.go b/sys/openbsd/init.go
index 8dabf3118..8d5e8b0dd 100644
--- a/sys/openbsd/init.go
+++ b/sys/openbsd/init.go
@@ -5,6 +5,7 @@ package openbsd
import (
"fmt"
+ "math"
"github.com/google/syzkaller/prog"
"github.com/google/syzkaller/sys/targets"
@@ -43,6 +44,8 @@ const (
// RLIMIT_DATA from openbsd:src/sys/sys/resource.h
rlimitData = 2
+ // RLIMIT_STACK from openbsd:src/sys/sys/resource.h
+ rlimitStack = 3
)
// openbsd:src/sys/sys/types.h
@@ -110,23 +113,38 @@ func (arch *arch) SanitizeCall(c *prog.Call) {
dev.Val = devNullDevT
}
case "setrlimit":
- // OpenBSD performs a strict validation of the RLIMIT_DATA soft
- // limit during memory allocation. Lowering the same limit could
- // cause syz-executor to run out of memory quickly. Therefore
- // make sure to not go lower than the default soft limit for the
- // staff group.
- if c.Args[0].(*prog.ConstArg).Val != rlimitData {
+ var rlimitMin uint64
+ var rlimitMax uint64 = math.MaxUint64
+ resource := c.Args[0].(*prog.ConstArg).Val
+ if resource == rlimitData {
+ // OpenBSD performs a strict validation of the
+ // RLIMIT_DATA soft limit during memory allocation.
+ // Lowering the same limit could cause syz-executor to
+ // run out of memory quickly. Therefore make sure to not
+ // go lower than the default soft limit for the staff
+ // group.
+ rlimitMin = 1536 * 1024 * 1024
+ } else if resource == rlimitStack {
+ // Do not allow the stack to grow beyond the initial
+ // soft limit chosen by syz-executor. Otherwise,
+ // syz-executor will most likely not be able to perform
+ // any more heap allocations since they majority of
+ // memory is reserved for the stack.
+ rlimitMax = 1 * 1024 * 1024
+ } else {
break
}
- var rlimitDataMin uint64 = 1536 * 1024 * 1024
ptr := c.Args[1].(*prog.PointerArg)
if ptr.Res != nil {
args := ptr.Res.(*prog.GroupArg).Inner
for _, arg := range args {
switch v := arg.(type) {
case *prog.ConstArg:
- if v.Val < rlimitDataMin {
- v.Val = rlimitDataMin
+ if v.Val < rlimitMin {
+ v.Val = rlimitMin
+ }
+ if v.Val > rlimitMax {
+ v.Val = rlimitMax
}
}
}
diff --git a/sys/openbsd/init_test.go b/sys/openbsd/init_test.go
index 157b46a86..6be30356e 100644
--- a/sys/openbsd/init_test.go
+++ b/sys/openbsd/init_test.go
@@ -52,6 +52,11 @@ func TestSanitizeMknodCall(t *testing.T) {
`setrlimit(0x2, &(0x7f0000cc0ff0)={0x60000000, 0x80000000})`,
},
{
+ // RLIMIT_STACK
+ `setrlimit(0x3, &(0x7f0000cc0ff0)={0x1000000000, 0x1000000000})`,
+ `setrlimit(0x3, &(0x7f0000cc0ff0)={0x100000, 0x100000})`,
+ },
+ {
// RLIMIT_CPU
`setrlimit(0x0, &(0x7f0000cc0ff0)={0x1, 0x1})`,
`setrlimit(0x0, &(0x7f0000cc0ff0)={0x1, 0x1})`,