diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2017-01-05 14:33:44 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2017-01-09 20:20:48 +0100 |
| commit | e8ddc2ae566d258db10a700b9e3a2e9548126d69 (patch) | |
| tree | 6082046e106867f70bb22818b55addaae6a079fb /sys | |
| parent | 9ba75ee1d71c41ca08dd45eaafacd2bd94303c00 (diff) | |
sys: don't add clock_gettime always
Currently we always enable clock_gettime in config.
This is required since the call is needed for generation of timespec/timeval structs.
The negative side effect is that one gets clock_gettime even
if he wants to fuzz a small set of unrelated syscalls.
Don't enable clock_gettime by default.
Instead handle timeval/timespec as other resources.
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/decl.go | 15 | ||||
| -rw-r--r-- | sys/decl_test.go | 13 |
2 files changed, 24 insertions, 4 deletions
diff --git a/sys/decl.go b/sys/decl.go index 322158b92..d09328c91 100644 --- a/sys/decl.go +++ b/sys/decl.go @@ -437,10 +437,8 @@ func TransitivelyEnabledCalls(enabled map[*Call]bool) map[*Call]bool { } for { n := len(supported) - for c := range enabled { - if !supported[c] { - continue - } + haveGettime := supported[CallMap["clock_gettime"]] + for c := range supported { canCreate := true for _, res := range c.InputResources() { noctors := true @@ -455,6 +453,15 @@ func TransitivelyEnabledCalls(enabled map[*Call]bool) map[*Call]bool { break } } + // We need to support structs as resources, + // but for now we just special-case timespec/timeval. + if canCreate && !haveGettime { + ForeachType(c, func(typ Type) { + if a, ok := typ.(*StructType); ok && a.Dir() != DirOut && (a.Name() == "timespec" || a.Name() == "timeval") { + canCreate = false + } + }) + } if !canCreate { delete(supported, c) } diff --git a/sys/decl_test.go b/sys/decl_test.go index a5c1d7be4..7c64f28fe 100644 --- a/sys/decl_test.go +++ b/sys/decl_test.go @@ -33,3 +33,16 @@ func TestTransitivelyEnabledCalls(t *testing.T) { t.Fatalf("epoll fd is not disabled") } } + +func TestClockGettime(t *testing.T) { + calls := make(map[*Call]bool) + for _, c := range Calls { + calls[c] = true + } + // Removal of clock_gettime should disable all calls that accept timespec/timeval. + delete(calls, CallMap["clock_gettime"]) + trans := TransitivelyEnabledCalls(calls) + if len(trans)+10 > len(calls) { + t.Fatalf("clock_gettime did not disable enough calls: before %v, after %v", len(calls), len(trans)) + } +} |
