From 18d59b1572479103ca92a887f4b23eaec6dcc67f Mon Sep 17 00:00:00 2001 From: Tonis Tiigi Date: Wed, 22 Dec 2021 20:34:36 -0800 Subject: [PATCH] test: add test for handling invalid sizes Signed-off-by: Tonis Tiigi --- test/sched.go | 6 +++++- test/sched_test.go | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/test/sched.go b/test/sched.go index 3f383ddf..5950cd02 100644 --- a/test/sched.go +++ b/test/sched.go @@ -114,7 +114,11 @@ func SchedGetAttr(pid int) (SchedAttr, error) { func SchedSetAttr(pid int, attr SchedAttr, flags SchedFlag) error { attr.Size = uint32(unsafe.Sizeof(attr)) - _, _, e1 := unix.Syscall(unix.SYS_SCHED_SETATTR, uintptr(pid), uintptr(unsafe.Pointer(&attr)), uintptr(flags)) + return schedSetAttr(pid, unsafe.Pointer(&attr), flags) +} + +func schedSetAttr(pid int, attr unsafe.Pointer, flags SchedFlag) error { + _, _, e1 := unix.Syscall(unix.SYS_SCHED_SETATTR, uintptr(pid), uintptr(attr), uintptr(flags)) if e1 != 0 { return syscall.Errno(e1) } diff --git a/test/sched_test.go b/test/sched_test.go index 35e87071..dd088c59 100644 --- a/test/sched_test.go +++ b/test/sched_test.go @@ -7,6 +7,7 @@ import ( "strconv" "syscall" "testing" + "unsafe" "github.com/stretchr/testify/require" ) @@ -150,3 +151,40 @@ func TestSchedAttr(t *testing.T) { require.Equal(t, 60, int(attr.SchedPriority)) } } + +func TestSchedAttrSize(t *testing.T) { + pid := os.Getpid() + + dt := make([]byte, 2) + ptr := unsafe.Pointer(&dt[0]) + err := schedSetAttr(pid, ptr, 0) + require.Error(t, err) + t.Logf("short read error: %v", err) // this error does not look consistent even with no emulation + + dt = make([]byte, 80) + ptr = unsafe.Pointer(&dt[0]) + + err = schedSetAttr(pid, ptr, 0) + require.NoError(t, err) // empty size is ok for some reason + + ints := (*[20]uint32)(ptr) + ints[0] = 8 // too small size + + err = schedSetAttr(pid, ptr, 0) + require.Error(t, err) + require.True(t, errors.Is(err, syscall.E2BIG)) + require.Equal(t, uint32(0x38), ints[0]) // expecting kernel 5.3+ + + ints[0] = 80 // too big but empty contents is ok + err = schedSetAttr(pid, ptr, 0) + require.NoError(t, err) + + ints[18] = 0xff // too big and not empty + + err = schedSetAttr(pid, ptr, 0) + require.Error(t, err) + require.True(t, errors.Is(err, syscall.E2BIG)) + require.Equal(t, uint32(0x38), ints[0]) // expecting kernel 5.3+ + + runtime.KeepAlive(dt) +}