github.com/gopacket/gopacket@v1.1.0/layers/fuzz_layer.go (about)

     1  // Copyright 2019 The GoPacket Authors. All rights reserved.
     2  //
     3  // Use of this source code is governed by a BSD-style license that can be found
     4  // in the LICENSE file in the root of the source tree.
     5  
     6  package layers
     7  
     8  import (
     9  	"encoding/binary"
    10  
    11  	"github.com/gopacket/gopacket"
    12  )
    13  
    14  // FuzzLayer is a fuzz target for the layers package of gopacket
    15  // A fuzz target is a function processing a binary blob (byte slice)
    16  // The process here is to interpret this data as a packet, and print the layers contents.
    17  // The decoding options and the starting layer are encoded in the first bytes.
    18  // The function returns 1 if this is a valid packet (no error layer)
    19  func FuzzLayer(data []byte) int {
    20  	if len(data) < 3 {
    21  		return 0
    22  	}
    23  	// use the first two bytes to choose the top level layer
    24  	startLayer := binary.BigEndian.Uint16(data[:2])
    25  	var fuzzOpts = gopacket.DecodeOptions{
    26  		Lazy:                     data[2]&0x1 != 0,
    27  		NoCopy:                   data[2]&0x2 != 0,
    28  		SkipDecodeRecovery:       data[2]&0x4 != 0,
    29  		DecodeStreamsAsDatagrams: data[2]&0x8 != 0,
    30  	}
    31  	p := gopacket.NewPacket(data[3:], gopacket.LayerType(startLayer), fuzzOpts)
    32  	for _, l := range p.Layers() {
    33  		gopacket.LayerString(l)
    34  	}
    35  	if p.ErrorLayer() != nil {
    36  		return 0
    37  	}
    38  	return 1
    39  }