Skip to content

Commit

Permalink
Use Go's new fuzz tooling instead of go-fuzz
Browse files Browse the repository at this point in the history
Use Go's new fuzz tooling instead of go-fuzz
  • Loading branch information
stv0g committed Feb 4, 2023
1 parent 7d27ddf commit 041953f
Show file tree
Hide file tree
Showing 5 changed files with 120 additions and 152 deletions.
111 changes: 0 additions & 111 deletions internal/proto/fuzz.go

This file was deleted.

155 changes: 114 additions & 41 deletions internal/proto/fuzz_test.go
Original file line number Diff line number Diff line change
@@ -1,53 +1,126 @@
// +build gofuzz

package proto

import (
"os"
"path/filepath"
"strings"
"encoding/binary"
"errors"
"fmt"
"testing"

"github.com/pion/stun"
)

func corpus(t *testing.T, function, typ string) [][]byte {
var data [][]byte
p := filepath.Join("fuzz", function, typ)
f, err := os.Open(p)
if err != nil {
if os.IsNotExist(err) {
t.Skip("does not exist")
}
t.Fatal(err)
}
list, err := f.Readdir(-1)
if err != nil {
t.Fatal(err)
}
for _, d := range list {
if strings.Contains(d.Name(), ".") {
// Skipping non-raw files.
continue
}
df, err := os.Open(filepath.Join(p, d.Name()))
type attr interface {
stun.Getter
stun.Setter
}

type attrs []struct {
g attr
t stun.AttrType
}

func (a attrs) pick(v byte) struct {
g attr
t stun.AttrType
} {
idx := int(v) % len(a)
return a[idx]
}

func FuzzSetters(f *testing.F) {
f.Fuzz(func(t *testing.T, attrType byte, value []byte) {
var (
m1 = &stun.Message{
Raw: make([]byte, 0, 2048),
}
m2 = &stun.Message{
Raw: make([]byte, 0, 2048),
}
m3 = &stun.Message{
Raw: make([]byte, 0, 2048),
}
)
attributes := attrs{
{new(ChannelNumber), stun.AttrChannelNumber},
{new(Lifetime), stun.AttrLifetime},
{new(XORPeerAddress), stun.AttrXORPeerAddress},
{new(Data), stun.AttrData},
{new(XORRelayedAddress), stun.AttrXORRelayedAddress},
{new(EvenPort), stun.AttrEvenPort},
{new(RequestedTransport), stun.AttrRequestedTransport},
{new(DontFragment), stun.AttrDontFragment},
{new(ReservationToken), stun.AttrReservationToken},
{new(ConnectionID), stun.AttrConnectionID},
{new(RequestedAddressFamily), stun.AttrRequestedAddressFamily},
}

attr := attributes.pick(attrType)

m1.WriteHeader()
m1.Add(attr.t, value)
if err := attr.g.GetFrom(m1); err != nil {
if errors.Is(err, stun.ErrAttributeNotFound) {
fmt.Println("unexpected 404") // nolint
panic(err) // nolint
}
return
}

m2.WriteHeader()
if err := attr.g.AddTo(m2); err != nil {
fmt.Println("failed to add attribute to m2") // nolint
panic(err) // nolint
}

m3.WriteHeader()
v, err := m2.Get(attr.t)
if err != nil {
t.Fatal(err)
}
buf := make([]byte, 5000)
n, _ := df.Read(buf)
data = append(data, buf[:n])
df.Close()
}
return data
panic(err) // nolint
}
m3.Add(attr.t, v)

if !m2.Equal(m3) {
fmt.Println(m2, "not equal", m3) // nolint
panic("not equal") // nolint
}
})
}

func TestFuzzSetters_Crashers(t *testing.T) {
for _, buf := range corpus(t, "turn-setters", "crashers") {
FuzzSetters(buf)
}
func FuzzChannelData(f *testing.F) {
d := &ChannelData{}

f.Fuzz(func(t *testing.T, data []byte) {
d.Reset()

if len(data) > channelDataHeaderSize {
// Make sure the channel id is in the proper range
if b := binary.BigEndian.Uint16(data[0:4]); b > 20000 {
binary.BigEndian.PutUint16(data[0:4], MinChannelNumber-1)
} else if b > 40000 {
binary.BigEndian.PutUint16(data[0:4], MinChannelNumber+(MaxChannelNumber-MinChannelNumber)%b)
}
}

d.Raw = append(d.Raw, data...)
if d.Decode() != nil {
return
}

d.Encode()
if !d.Number.Valid() {
return
}

d2 := &ChannelData{}
d2.Raw = d.Raw
if err := d2.Decode(); err != nil {
panic(err) //nolint
}
})
}

func TestFuzzSetters_Coverage(t *testing.T) {
for _, buf := range corpus(t, "turn-setters", "corpus") {
FuzzSetters(buf)
}
func FuzzIsChannelData(f *testing.F) {
f.Fuzz(func(t *testing.T, data []byte) {
IsChannelData(data)
})
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("@\x00\x00d\x00\x01\x00P!\x12\xa4BE71r/+2+nNzX\x00\x06\x00\tD7X4:3wlY\x00\x00\x00\xc0W\x00\x04\x00\x00\x03\xe7\x80*\x00\b\x1dQ6ڶ[\x16\x93\x00%\x00\x00\x00$\x00\x04n\x00\x1e\xff\x00\b\x00\x14e\xd1\x1a3\x0e\x10J\x9f_Y\x8a\xf4\xabƨ\x05\xf2`\x03π(\x00\x04k3DB@\x00\x02#\x16\xfe\xfd\x00\x00\x00\x00\x00\x00\x00\x11\x01,\v\x00\x01 \x00\x01\x00\x00\x00\x00\x01 \x00\x01\x1d\x00\x01\x1a0\x82\x01\x160\x81\xbd\xa0\x03\x02\x01\x02\x02\t\x00\xaf\xe5(q4\v\xd1>0\n\x06\b*\x86H\xce=\x04\x03\x020\x111\x0f0\r\x06\x03U\x04\x03\f\x06WebRTC0\x1e\x17\r180811035200Z\x17\r180911035200Z0\x111\x0f0\r\x06\x03U\x04\x03\f\x06WebRTC0Y0\x13\x06\a*\x86H\xce=\x02\x01\x06\b*\x86H\xce=\x03\x01\a\x03B\x00\x04\x80\x80\xe3H\xbdAF\x9c\xfbz}\xf3\x16go\xd7*\x06!\x17e\xa5\n\x0f\v\aRl\x87-π\t>\xd5ʣ\xf5\xa4\nr]\xd7KA\xb7\x9b\xdd\x19\xeec\fS\x13\xc8`\x1di\x83(l\x87\"\xc10\n\x06\b*\x86H\xce=\x04\x03\x02\x03H\x000E\x02!\x00\xd1:\n\x13\x1b©\xf2z\xbd=LT\x7f~\xf1r\x99j\f\aU\xc7\a\xb6\xa3\xe0H\xd8v-\xed\x02 \x05_\xc8\x18(\x18\xa6D\xa3ӵ\xb1W0L\xc3\xf1B\x1f\xad\xb0bc\xbf\xb4Q\xcd(\xbeK\xc9\xee\x16\xfe\xfd\x00\x00\x00\x00\x00\x00\x00\x12\x00-\x10\x00\x00!\x00\x02\x00\x00\x00\x00\x00! \xf7\xe2<\x97\xdfE\xa9n\x13\xcb>v\xb3~\xff^s\xe2\xae\xe0\xb6A])D=\v\xd2OW\x8b~\x16\xfe\xfd\x00\x00\x00\x00\x00\x00\x00\x13\x00X\x0f\x00\x00L\x00\x03\x00\x00\x00\x00\x00L\x04\x03\x00H0F\x02!\x00\xfd\xbbt걬\xa1S.j\xc0\xab&}[\x83\xa2K\xb4\xd5\xd7\xd5\x04\x93n'\x85\xe6㈲\xbd\x02!\x00\xf6\xa4W\xb9\xed\xd9\xea\xd5*\x9d\x0e\x9a\x19$\v:h\xb9V\x99Tl\x04O\x86<\xf84\x9b\xc8\x04b\x14\xfe\xfd\x00\x00\x00\x00\x00\x00\x00\x14\x00\x01\x01\x16\xfe\xfd\x00\x01\x00\x00\x00\x00\x00\x04\x000\x00\x01\x00\x00\x00\x00\x00\x04\n\xae$!\xe7\xd5Ic*}\xef\x8e\xd0h\x98\xc3ŵ?[\x81*\x96:9\xabl\xdd0;y\xbd\xb27\xf31L\x1d\xa2\x1b")
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("@\x00\x02#\x16\xfe\xfd\x00\x00\x00\x00\x00\x00\x00\x11\x01,\v\x00\x01 \x00\x01\x00\x00\x00\x00\x01 \x00\x01\x1d\x00\x01\x1a0\x82\x01\x160\x81\xbd\xa0\x03\x02\x01\x02\x02\t\x00\xaf\xe5(q4\v\xd1>0\n\x06\b*\x86H\xce=\x04\x03\x020\x111\x0f0\r\x06\x03U\x04\x03\f\x06WebRTC0\x1e\x17\r180811035200Z\x17\r180911035200Z0\x111\x0f0\r\x06\x03U\x04\x03\f\x06WebRTC0Y0\x13\x06\a*\x86H\xce=\x02\x01\x06\b*\x86H\xce=\x03\x01\a\x03B\x00\x04\x80\x80\xe3H\xbdAF\x9c\xfbz}\xf3\x16go\xd7*\x06!\x17e\xa5\n\x0f\v\aRl\x87-π\t>\xd5ʣ\xf5\xa4\nr]\xd7KA\xb7\x9b\xdd\x19\xeec\fS\x13\xc8`\x1di\x83(l\x87\"\xc10\n\x06\b*\x86H\xce=\x04\x03\x02\x03H\x000E\x02!\x00\xd1:\n\x13\x1b©\xf2z\xbd=LT\x7f~\xf1r\x99j\f\aU\xc7\a\xb6\xa3\xe0H\xd8v-\xed\x02 \x05_\xc8\x18(\x18\xa6D\xa3ӵ\xb1W0L\xc3\xf1B\x1f\xad\xb0bc\xbf\xb4Q\xcd(\xbeK\xc9\xee\x16\xfe\xfd\x00\x00\x00\x00\x00\x00\x00\x12\x00-\x10\x00\x00!\x00\x02\x00\x00\x00\x00\x00! \xf7\xe2<\x97\xdfE\xa9n\x13\xcb>v\xb3~\xff^s\xe2\xae\xe0\xb6A])D=\v\xd2OW\x8b~\x16\xfe\xfd\x00\x00\x00\x00\x00\x00\x00\x13\x00X\x0f\x00\x00L\x00\x03\x00\x00\x00\x00\x00L\x04\x03\x00H0F\x02!\x00\xfd\xbbt걬\xa1S.j\xc0\xab&}[\x83\xa2K\xb4\xd5\xd7\xd5\x04\x93n'\x85\xe6㈲\xbd\x02!\x00\xf6\xa4W\xb9\xed\xd9\xea\xd5*\x9d\x0e\x9a\x19$\v:h\xb9V\x99Tl\x04O\x86<\xf84\x9b\xc8\x04b\x14\xfe\xfd\x00\x00\x00\x00\x00\x00\x00\x14\x00\x01\x01\x16\xfe\xfd\x00\x01\x00\x00\x00\x00\x00\x04\x000\x00\x01\x00\x00\x00\x00\x00\x04\n\xae$!\xe7\xd5Ic*}\xef\x8e\xd0h\x98\xc3ŵ?[\x81*\x96:9\xabl\xdd0;y\xbd\xb27\xf31L\x1d\xa2\x1b")
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
go test fuzz v1
[]byte("*")

0 comments on commit 041953f

Please sign in to comment.