github.com/cilium/ebpf@v0.10.0/btf/fuzz_test.go (about) 1 package btf 2 3 import ( 4 "bytes" 5 "encoding/binary" 6 "fmt" 7 "io" 8 "testing" 9 10 "github.com/cilium/ebpf/internal" 11 ) 12 13 func FuzzSpec(f *testing.F) { 14 var buf bytes.Buffer 15 err := binary.Write(&buf, internal.NativeEndian, &btfHeader{ 16 Magic: btfMagic, 17 Version: 1, 18 HdrLen: uint32(binary.Size(btfHeader{})), 19 }) 20 if err != nil { 21 f.Fatal(err) 22 } 23 f.Add(buf.Bytes()) 24 f.Fuzz(func(t *testing.T, data []byte) { 25 if len(data) < binary.Size(btfHeader{}) { 26 t.Skip("data is too short") 27 } 28 29 spec, err := loadRawSpec(bytes.NewReader(data), internal.NativeEndian, nil, nil) 30 if err != nil { 31 if spec != nil { 32 t.Fatal("spec is not nil") 33 } 34 return 35 } 36 37 if spec == nil { 38 t.Fatal("spec is nil") 39 } 40 41 for _, typ := range spec.types { 42 fmt.Fprintf(io.Discard, "%+10v", typ) 43 } 44 }) 45 } 46 47 func FuzzExtInfo(f *testing.F) { 48 var buf bytes.Buffer 49 err := binary.Write(&buf, internal.NativeEndian, &btfExtHeader{ 50 Magic: btfMagic, 51 Version: 1, 52 HdrLen: uint32(binary.Size(btfExtHeader{})), 53 }) 54 if err != nil { 55 f.Fatal(err) 56 } 57 f.Add(buf.Bytes(), []byte("\x00foo\x00barfoo\x00")) 58 59 f.Fuzz(func(t *testing.T, data, strings []byte) { 60 if len(data) < binary.Size(btfExtHeader{}) { 61 t.Skip("data is too short") 62 } 63 64 table, err := readStringTable(bytes.NewReader(strings), nil) 65 if err != nil { 66 t.Skip("invalid string table") 67 } 68 69 info, err := loadExtInfos(bytes.NewReader(data), internal.NativeEndian, nil, table) 70 if err != nil { 71 if info != nil { 72 t.Fatal("info is not nil") 73 } 74 } else if info == nil { 75 t.Fatal("info is nil") 76 } 77 }) 78 }