40 lines
1.2 KiB
Go
40 lines
1.2 KiB
Go
// Copyright 2019 The GoPacket Authors. All rights reserved.
|
|
//
|
|
// Use of this source code is governed by a BSD-style license that can be found
|
|
// in the LICENSE file in the root of the source tree.
|
|
|
|
package layers
|
|
|
|
import (
|
|
"encoding/binary"
|
|
|
|
"github.com/google/gopacket"
|
|
)
|
|
|
|
// FuzzLayer is a fuzz target for the layers package of gopacket
|
|
// A fuzz target is a function processing a binary blob (byte slice)
|
|
// The process here is to interpret this data as a packet, and print the layers contents.
|
|
// The decoding options and the starting layer are encoded in the first bytes.
|
|
// The function returns 1 if this is a valid packet (no error layer)
|
|
func FuzzLayer(data []byte) int {
|
|
if len(data) < 3 {
|
|
return 0
|
|
}
|
|
// use the first two bytes to choose the top level layer
|
|
startLayer := binary.BigEndian.Uint16(data[:2])
|
|
var fuzzOpts = gopacket.DecodeOptions{
|
|
Lazy: data[2]&0x1 != 0,
|
|
NoCopy: data[2]&0x2 != 0,
|
|
SkipDecodeRecovery: data[2]&0x4 != 0,
|
|
DecodeStreamsAsDatagrams: data[2]&0x8 != 0,
|
|
}
|
|
p := gopacket.NewPacket(data[3:], gopacket.LayerType(startLayer), fuzzOpts)
|
|
for _, l := range p.Layers() {
|
|
gopacket.LayerString(l)
|
|
}
|
|
if p.ErrorLayer() != nil {
|
|
return 0
|
|
}
|
|
return 1
|
|
}
|