summaryrefslogtreecommitdiff
path: root/vendor/github.com/pion/turn/v2/internal/proto/fuzz.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/pion/turn/v2/internal/proto/fuzz.go')
-rw-r--r--vendor/github.com/pion/turn/v2/internal/proto/fuzz.go111
1 files changed, 111 insertions, 0 deletions
diff --git a/vendor/github.com/pion/turn/v2/internal/proto/fuzz.go b/vendor/github.com/pion/turn/v2/internal/proto/fuzz.go
new file mode 100644
index 0000000..1a171fb
--- /dev/null
+++ b/vendor/github.com/pion/turn/v2/internal/proto/fuzz.go
@@ -0,0 +1,111 @@
+// +build gofuzz
+
+package proto
+
+import (
+ "fmt"
+
+ "github.com/pion/stun"
+)
+
+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(data []byte) int {
+ 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(RequestedTransport), stun.AttrRequestedTransport},
+ {new(RelayedAddress), stun.AttrXORRelayedAddress},
+ {new(ChannelNumber), stun.AttrChannelNumber},
+ {new(Data), stun.AttrData},
+ {new(EvenPort), stun.AttrEvenPort},
+ {new(Lifetime), stun.AttrLifetime},
+ {new(ReservationToken), stun.AttrReservationToken},
+ }
+ var firstByte = byte(0)
+ if len(data) > 0 {
+ firstByte = data[0]
+ }
+ a := attributes.pick(firstByte)
+ value := data
+ if len(data) > 1 {
+ value = value[1:]
+ }
+ m1.WriteHeader()
+ m1.Add(a.t, value)
+ err := a.g.GetFrom(m1)
+ if err == stun.ErrAttributeNotFound {
+ fmt.Println("unexpected 404") // nolint
+ panic(err) // nolint
+ }
+ if err != nil {
+ return 1
+ }
+ m2.WriteHeader()
+ if err := a.g.AddTo(m2); err != nil {
+ fmt.Println("failed to add attribute to m2") // nolint
+ panic(err) // nolint
+ }
+ m3.WriteHeader()
+ v, err := m2.Get(a.t)
+ if err != nil {
+ panic(err) // nolint
+ }
+ m3.Add(a.t, v)
+
+ if !m2.Equal(m3) {
+ fmt.Println(m2, "not equal", m3) // nolint
+ panic("not equal") // nolint
+ }
+ return 1
+}
+
+var d = &ChannelData{}
+
+func FuzzChannelData(data []byte) int {
+ d.Reset()
+ if b := bin.Uint16(data[0:4]); b > 20000 {
+ bin.PutUint16(data[0:4], MinChannelNumber-1)
+ } else if b > 40000 {
+ bin.PutUint16(data[0:4], MinChannelNumber+(MaxChannelNumber-MinChannelNumber)%b)
+ }
+ d.Raw = append(d.Raw, data...)
+ if d.Decode() != nil {
+ return 0
+ }
+ d2 := &ChannelData{}
+ d.Encode()
+ if !d.Number.Valid() {
+ return 1
+ }
+ d2.Raw = d.Raw
+ if err := d2.Decode(); err != nil {
+ panic(err) //nolint
+ }
+ return 1
+}