blob: 7d4d82a4d2357f4683f1994a6d3466ab1023c54a [file] [edit]
package oci
import (
"encoding/binary"
"testing"
"github.com/opencontainers/runtime-spec/specs-go"
)
func FuzzAppendDevicePermissionsFromCgroupRules(f *testing.F) {
f.Fuzz(func(t *testing.T, data []byte, noOfRecords uint8, ruleData []byte) {
sp := make([]specs.LinuxDeviceCgroup, 0)
for range noOfRecords % 40 {
var s specs.LinuxDeviceCgroup
data = generateDeviceCgroup(data, &s)
sp = append(sp, s)
if len(data) == 0 {
break
}
}
rules := generateRules(ruleData)
// Exercise AppendDevicePermissionsFromCgroupRules with arbitrary
// cgroup rules and rule strings. Errors are expected for some inputs;
// the fuzz target is only checking that it doesn't panic.
_, _ = AppendDevicePermissionsFromCgroupRules(sp, rules)
})
}
func generateRules(data []byte) []string {
const maxRules = 40
rules := make([]string, 0, min(maxRules, len(data)))
for len(data) > 0 && len(rules) < maxRules {
n := int(data[0] % 64)
data = data[1:]
if n > len(data) {
n = len(data)
}
rules = append(rules, string(data[:n]))
data = data[n:]
}
return rules
}
func generateDeviceCgroup(data []byte, s *specs.LinuxDeviceCgroup) []byte {
if len(data) < 14 {
return nil
}
s.Allow = data[0]%2 != 0
switch data[1] % 5 {
case 0:
s.Type = "a"
case 1:
s.Type = "b"
case 2:
s.Type = "c"
case 3:
s.Type = ""
default:
s.Type = string(data[1:2])
}
if data[2]%2 != 0 {
v := int64(int32(binary.LittleEndian.Uint32(data[6:10])))
s.Major = &v
}
if data[3]%2 != 0 {
v := int64(int32(binary.LittleEndian.Uint32(data[10:14])))
s.Minor = &v
}
switch data[4] % 9 {
case 0:
s.Access = "r"
case 1:
s.Access = "w"
case 2:
s.Access = "m"
case 3:
s.Access = "rw"
case 4:
s.Access = "rm"
case 5:
s.Access = "wm"
case 6:
s.Access = "rwm"
case 7:
s.Access = ""
default:
s.Access = string(data[5:6])
}
return data[14:]
}