go.mod: github.com/AdaLogics/go-fuzz-headers v0.0.0-20221118232415-3345c89a7c72
full diff: 443f56ff4b...3345c89a7c
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
parent
df4d07352d
commit
0f616e3549
2
go.mod
2
go.mod
@ -3,7 +3,7 @@ module github.com/containerd/containerd
|
|||||||
go 1.18
|
go 1.18
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/AdaLogics/go-fuzz-headers v0.0.0-20221103172237-443f56ff4ba8
|
github.com/AdaLogics/go-fuzz-headers v0.0.0-20221118232415-3345c89a7c72
|
||||||
github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20220912195655-e1f97a00006b
|
github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20220912195655-e1f97a00006b
|
||||||
github.com/Microsoft/go-winio v0.6.0
|
github.com/Microsoft/go-winio v0.6.0
|
||||||
github.com/Microsoft/hcsshim v0.10.0-rc.1
|
github.com/Microsoft/hcsshim v0.10.0-rc.1
|
||||||
|
4
go.sum
4
go.sum
@ -44,8 +44,8 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX
|
|||||||
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
|
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
|
||||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
||||||
github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg=
|
github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg=
|
||||||
github.com/AdaLogics/go-fuzz-headers v0.0.0-20221103172237-443f56ff4ba8 h1:d+pBUmsteW5tM87xmVXHZ4+LibHRFn40SPAoZJOg2ak=
|
github.com/AdaLogics/go-fuzz-headers v0.0.0-20221118232415-3345c89a7c72 h1:kq78byqmxX6R9uk4uN3HD2F5tkZJAZMauuLSkNPS8to=
|
||||||
github.com/AdaLogics/go-fuzz-headers v0.0.0-20221103172237-443f56ff4ba8/go.mod h1:i9fr2JpcEcY/IHEvzCM3qXUZYOQHgR89dt4es1CgMhc=
|
github.com/AdaLogics/go-fuzz-headers v0.0.0-20221118232415-3345c89a7c72/go.mod h1:VzwV+t+dZ9j/H867F1M2ziD+yLHtB46oM35FxxMJ4d0=
|
||||||
github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20220912195655-e1f97a00006b h1:RQhYYLDVbdN+fw4I+A90nMRcxg/tEg4KvHiDYOwY32g=
|
github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20220912195655-e1f97a00006b h1:RQhYYLDVbdN+fw4I+A90nMRcxg/tEg4KvHiDYOwY32g=
|
||||||
github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20220912195655-e1f97a00006b/go.mod h1:P/MhpyNnqWUWlF8b/ksNuhU2kywD3Qc5fzauL06Gez8=
|
github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20220912195655-e1f97a00006b/go.mod h1:P/MhpyNnqWUWlF8b/ksNuhU2kywD3Qc5fzauL06Gez8=
|
||||||
github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
|
github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
|
||||||
|
@ -20,7 +20,7 @@ require (
|
|||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/AdaLogics/go-fuzz-headers v0.0.0-20221103172237-443f56ff4ba8
|
github.com/AdaLogics/go-fuzz-headers v0.0.0-20221118232415-3345c89a7c72
|
||||||
github.com/containerd/cgroups/v3 v3.0.0-20221112182753-e8802a182774
|
github.com/containerd/cgroups/v3 v3.0.0-20221112182753-e8802a182774
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -363,8 +363,8 @@ cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vf
|
|||||||
cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA=
|
cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA=
|
||||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
||||||
github.com/AdaLogics/go-fuzz-headers v0.0.0-20220824214621-3c06a36a6952/go.mod h1:i9fr2JpcEcY/IHEvzCM3qXUZYOQHgR89dt4es1CgMhc=
|
github.com/AdaLogics/go-fuzz-headers v0.0.0-20220824214621-3c06a36a6952/go.mod h1:i9fr2JpcEcY/IHEvzCM3qXUZYOQHgR89dt4es1CgMhc=
|
||||||
github.com/AdaLogics/go-fuzz-headers v0.0.0-20221103172237-443f56ff4ba8 h1:d+pBUmsteW5tM87xmVXHZ4+LibHRFn40SPAoZJOg2ak=
|
github.com/AdaLogics/go-fuzz-headers v0.0.0-20221118232415-3345c89a7c72 h1:kq78byqmxX6R9uk4uN3HD2F5tkZJAZMauuLSkNPS8to=
|
||||||
github.com/AdaLogics/go-fuzz-headers v0.0.0-20221103172237-443f56ff4ba8/go.mod h1:i9fr2JpcEcY/IHEvzCM3qXUZYOQHgR89dt4es1CgMhc=
|
github.com/AdaLogics/go-fuzz-headers v0.0.0-20221118232415-3345c89a7c72/go.mod h1:VzwV+t+dZ9j/H867F1M2ziD+yLHtB46oM35FxxMJ4d0=
|
||||||
github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20220912195655-e1f97a00006b h1:RQhYYLDVbdN+fw4I+A90nMRcxg/tEg4KvHiDYOwY32g=
|
github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20220912195655-e1f97a00006b h1:RQhYYLDVbdN+fw4I+A90nMRcxg/tEg4KvHiDYOwY32g=
|
||||||
github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20220912195655-e1f97a00006b/go.mod h1:P/MhpyNnqWUWlF8b/ksNuhU2kywD3Qc5fzauL06Gez8=
|
github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20220912195655-e1f97a00006b/go.mod h1:P/MhpyNnqWUWlF8b/ksNuhU2kywD3Qc5fzauL06Gez8=
|
||||||
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
|
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
|
||||||
|
416
vendor/github.com/AdaLogics/go-fuzz-headers/consumer.go
generated
vendored
416
vendor/github.com/AdaLogics/go-fuzz-headers/consumer.go
generated
vendored
@ -18,9 +18,7 @@ import (
|
|||||||
securejoin "github.com/cyphar/filepath-securejoin"
|
securejoin "github.com/cyphar/filepath-securejoin"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var MaxTotalLen uint32 = 2000000
|
||||||
MaxTotalLen = uint32(2000000)
|
|
||||||
)
|
|
||||||
|
|
||||||
func SetMaxTotalLen(newLen uint32) {
|
func SetMaxTotalLen(newLen uint32) {
|
||||||
MaxTotalLen = newLen
|
MaxTotalLen = newLen
|
||||||
@ -28,6 +26,7 @@ func SetMaxTotalLen(newLen uint32) {
|
|||||||
|
|
||||||
type ConsumeFuzzer struct {
|
type ConsumeFuzzer struct {
|
||||||
data []byte
|
data []byte
|
||||||
|
dataTotal uint32
|
||||||
CommandPart []byte
|
CommandPart []byte
|
||||||
RestOfArray []byte
|
RestOfArray []byte
|
||||||
NumberOfCalls int
|
NumberOfCalls int
|
||||||
@ -41,22 +40,23 @@ func IsDivisibleBy(n int, divisibleby int) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func NewConsumer(fuzzData []byte) *ConsumeFuzzer {
|
func NewConsumer(fuzzData []byte) *ConsumeFuzzer {
|
||||||
fuzzMap := make(map[reflect.Type]reflect.Value)
|
return &ConsumeFuzzer{
|
||||||
f := &ConsumeFuzzer{data: fuzzData, position: 0, Funcs: fuzzMap}
|
data: fuzzData,
|
||||||
return f
|
dataTotal: uint32(len(fuzzData)),
|
||||||
|
Funcs: make(map[reflect.Type]reflect.Value),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *ConsumeFuzzer) Split(minCalls, maxCalls int) error {
|
func (f *ConsumeFuzzer) Split(minCalls, maxCalls int) error {
|
||||||
if len(f.data) == 0 {
|
if f.dataTotal == 0 {
|
||||||
return errors.New("Could not split")
|
return errors.New("could not split")
|
||||||
}
|
}
|
||||||
numberOfCalls := int(f.data[0])
|
numberOfCalls := int(f.data[0])
|
||||||
if numberOfCalls < minCalls || numberOfCalls > maxCalls {
|
if numberOfCalls < minCalls || numberOfCalls > maxCalls {
|
||||||
return errors.New("Bad number of calls")
|
return errors.New("bad number of calls")
|
||||||
|
|
||||||
}
|
}
|
||||||
if len(f.data) < numberOfCalls+numberOfCalls+1 {
|
if int(f.dataTotal) < numberOfCalls+numberOfCalls+1 {
|
||||||
return errors.New("Length of data does not match required parameters")
|
return errors.New("length of data does not match required parameters")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Define part 2 and 3 of the data array
|
// Define part 2 and 3 of the data array
|
||||||
@ -65,12 +65,12 @@ func (f *ConsumeFuzzer) Split(minCalls, maxCalls int) error {
|
|||||||
|
|
||||||
// Just a small check. It is necessary
|
// Just a small check. It is necessary
|
||||||
if len(commandPart) != numberOfCalls {
|
if len(commandPart) != numberOfCalls {
|
||||||
return errors.New("Length of commandPart does not match number of calls")
|
return errors.New("length of commandPart does not match number of calls")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if restOfArray is divisible by numberOfCalls
|
// Check if restOfArray is divisible by numberOfCalls
|
||||||
if !IsDivisibleBy(len(restOfArray), numberOfCalls) {
|
if !IsDivisibleBy(len(restOfArray), numberOfCalls) {
|
||||||
return errors.New("Length of commandPart does not match number of calls")
|
return errors.New("length of commandPart does not match number of calls")
|
||||||
}
|
}
|
||||||
f.CommandPart = commandPart
|
f.CommandPart = commandPart
|
||||||
f.RestOfArray = restOfArray
|
f.RestOfArray = restOfArray
|
||||||
@ -87,77 +87,55 @@ func (f *ConsumeFuzzer) DisallowUnexportedFields() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (f *ConsumeFuzzer) GenerateStruct(targetStruct interface{}) error {
|
func (f *ConsumeFuzzer) GenerateStruct(targetStruct interface{}) error {
|
||||||
v := reflect.ValueOf(targetStruct)
|
e := reflect.ValueOf(targetStruct).Elem()
|
||||||
/*if !v.CanSet() {
|
return f.fuzzStruct(e, false)
|
||||||
return errors.New("This interface cannot be set")
|
|
||||||
}*/
|
|
||||||
e := v.Elem()
|
|
||||||
err := f.fuzzStruct(e, false)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *ConsumeFuzzer) setCustom(v reflect.Value) error {
|
func (f *ConsumeFuzzer) setCustom(v reflect.Value) error {
|
||||||
// First: see if we have a fuzz function for it.
|
// First: see if we have a fuzz function for it.
|
||||||
doCustom, ok := f.Funcs[v.Type()]
|
doCustom, ok := f.Funcs[v.Type()]
|
||||||
if !ok {
|
if !ok {
|
||||||
return fmt.Errorf("Could not find a custom function")
|
return fmt.Errorf("could not find a custom function")
|
||||||
}
|
}
|
||||||
|
|
||||||
switch v.Kind() {
|
switch v.Kind() {
|
||||||
case reflect.Ptr:
|
case reflect.Ptr:
|
||||||
if v.IsNil() {
|
if v.IsNil() {
|
||||||
if !v.CanSet() {
|
if !v.CanSet() {
|
||||||
return fmt.Errorf("Could not use a custom function")
|
return fmt.Errorf("could not use a custom function")
|
||||||
}
|
}
|
||||||
v.Set(reflect.New(v.Type().Elem()))
|
v.Set(reflect.New(v.Type().Elem()))
|
||||||
}
|
}
|
||||||
case reflect.Map:
|
case reflect.Map:
|
||||||
if v.IsNil() {
|
if v.IsNil() {
|
||||||
if !v.CanSet() {
|
if !v.CanSet() {
|
||||||
return fmt.Errorf("Could not use a custom function")
|
return fmt.Errorf("could not use a custom function")
|
||||||
}
|
}
|
||||||
v.Set(reflect.MakeMap(v.Type()))
|
v.Set(reflect.MakeMap(v.Type()))
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("Could not use a custom function")
|
return fmt.Errorf("could not use a custom function")
|
||||||
}
|
}
|
||||||
|
|
||||||
verr := doCustom.Call([]reflect.Value{v, reflect.ValueOf(Continue{
|
verr := doCustom.Call([]reflect.Value{v, reflect.ValueOf(Continue{
|
||||||
F: f,
|
F: f,
|
||||||
})})
|
})})
|
||||||
|
|
||||||
// check if we return an error
|
// check if we return an error
|
||||||
if verr[0].IsNil() {
|
if verr[0].IsNil() {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return fmt.Errorf("Could not use a custom function")
|
return fmt.Errorf("could not use a custom function")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *ConsumeFuzzer) fuzzStruct(e reflect.Value, customFunctions bool) error {
|
func (f *ConsumeFuzzer) fuzzStruct(e reflect.Value, customFunctions bool) error {
|
||||||
|
|
||||||
// We check if we should check for custom functions
|
// We check if we should check for custom functions
|
||||||
if customFunctions {
|
if customFunctions && e.IsValid() && e.CanAddr() {
|
||||||
if e.IsValid() {
|
|
||||||
if e.CanAddr() {
|
|
||||||
err := f.setCustom(e.Addr())
|
err := f.setCustom(e.Addr())
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* return f.setCustom(e)
|
|
||||||
_, ok := f.Funcs[e.Type()]
|
|
||||||
if ok {
|
|
||||||
if e.CanAddr() {
|
|
||||||
err := f.setCustom(e.Addr())
|
|
||||||
if err == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
//return f.setCustom(e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch e.Kind() {
|
switch e.Kind() {
|
||||||
case reflect.Struct:
|
case reflect.Struct:
|
||||||
@ -167,24 +145,14 @@ func (f *ConsumeFuzzer) fuzzStruct(e reflect.Value, customFunctions bool) error
|
|||||||
if f.fuzzUnexportedFields {
|
if f.fuzzUnexportedFields {
|
||||||
v = reflect.NewAt(e.Field(i).Type(), unsafe.Pointer(e.Field(i).UnsafeAddr())).Elem()
|
v = reflect.NewAt(e.Field(i).Type(), unsafe.Pointer(e.Field(i).UnsafeAddr())).Elem()
|
||||||
}
|
}
|
||||||
err := f.fuzzStruct(v, customFunctions)
|
if err := f.fuzzStruct(v, customFunctions); err != nil {
|
||||||
if err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/*if e.Field(i).Kind() == reflect.Struct {
|
|
||||||
//e = reflect.NewAt(e.Type(), unsafe.Pointer(e.UnsafeAddr())).Elem()
|
|
||||||
//e.Field(i).Set(reflect.New(e.Field(i).Type()))
|
|
||||||
}*/
|
|
||||||
v = e.Field(i)
|
v = e.Field(i)
|
||||||
//v = reflect.New(e.Field(i).Type())
|
if err := f.fuzzStruct(v, customFunctions); err != nil {
|
||||||
err := f.fuzzStruct(v, customFunctions)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
/*if e.Field(i).CanSet() {
|
|
||||||
e.Field(i).Set(v.Elem())
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case reflect.String:
|
case reflect.String:
|
||||||
@ -208,18 +176,16 @@ func (f *ConsumeFuzzer) fuzzStruct(e reflect.Value, customFunctions bool) error
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
var numOfElements uint32
|
numOfElements := randQty % maxElements
|
||||||
numOfElements = randQty % maxElements
|
if (f.dataTotal - f.position) < numOfElements {
|
||||||
if (uint32(len(f.data)) - f.position) < numOfElements {
|
numOfElements = f.dataTotal - f.position
|
||||||
numOfElements = uint32(len(f.data)) - f.position
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uu := reflect.MakeSlice(e.Type(), int(numOfElements), int(numOfElements))
|
uu := reflect.MakeSlice(e.Type(), int(numOfElements), int(numOfElements))
|
||||||
|
|
||||||
for i := 0; i < int(numOfElements); i++ {
|
for i := 0; i < int(numOfElements); i++ {
|
||||||
err := f.fuzzStruct(uu.Index(i), customFunctions)
|
|
||||||
// If we have more than 10, then we can proceed with that.
|
// If we have more than 10, then we can proceed with that.
|
||||||
if err != nil {
|
if err := f.fuzzStruct(uu.Index(i), customFunctions); err != nil {
|
||||||
if i >= 10 {
|
if i >= 10 {
|
||||||
if e.CanSet() {
|
if e.CanSet() {
|
||||||
e.Set(uu)
|
e.Set(uu)
|
||||||
@ -284,7 +250,7 @@ func (f *ConsumeFuzzer) fuzzStruct(e reflect.Value, customFunctions bool) error
|
|||||||
case reflect.Map:
|
case reflect.Map:
|
||||||
if e.CanSet() {
|
if e.CanSet() {
|
||||||
e.Set(reflect.MakeMap(e.Type()))
|
e.Set(reflect.MakeMap(e.Type()))
|
||||||
maxElements := 50
|
const maxElements = 50
|
||||||
randQty, err := f.GetInt()
|
randQty, err := f.GetInt()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -292,13 +258,11 @@ func (f *ConsumeFuzzer) fuzzStruct(e reflect.Value, customFunctions bool) error
|
|||||||
numOfElements := randQty % maxElements
|
numOfElements := randQty % maxElements
|
||||||
for i := 0; i < numOfElements; i++ {
|
for i := 0; i < numOfElements; i++ {
|
||||||
key := reflect.New(e.Type().Key()).Elem()
|
key := reflect.New(e.Type().Key()).Elem()
|
||||||
err := f.fuzzStruct(key, customFunctions)
|
if err := f.fuzzStruct(key, customFunctions); err != nil {
|
||||||
if err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
val := reflect.New(e.Type().Elem()).Elem()
|
val := reflect.New(e.Type().Elem()).Elem()
|
||||||
err = f.fuzzStruct(val, customFunctions)
|
if err = f.fuzzStruct(val, customFunctions); err != nil {
|
||||||
if err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
e.SetMapIndex(key, val)
|
e.SetMapIndex(key, val)
|
||||||
@ -307,8 +271,7 @@ func (f *ConsumeFuzzer) fuzzStruct(e reflect.Value, customFunctions bool) error
|
|||||||
case reflect.Ptr:
|
case reflect.Ptr:
|
||||||
if e.CanSet() {
|
if e.CanSet() {
|
||||||
e.Set(reflect.New(e.Type().Elem()))
|
e.Set(reflect.New(e.Type().Elem()))
|
||||||
err := f.fuzzStruct(e.Elem(), customFunctions)
|
if err := f.fuzzStruct(e.Elem(), customFunctions); err != nil {
|
||||||
if err != nil {
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
@ -321,43 +284,39 @@ func (f *ConsumeFuzzer) fuzzStruct(e reflect.Value, customFunctions bool) error
|
|||||||
if e.CanSet() {
|
if e.CanSet() {
|
||||||
e.SetUint(uint64(b))
|
e.SetUint(uint64(b))
|
||||||
}
|
}
|
||||||
default:
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *ConsumeFuzzer) GetStringArray() (reflect.Value, error) {
|
func (f *ConsumeFuzzer) GetStringArray() (reflect.Value, error) {
|
||||||
// The max size of the array:
|
// The max size of the array:
|
||||||
max := uint32(20)
|
const max uint32 = 20
|
||||||
|
|
||||||
arraySize := f.position
|
arraySize := f.position
|
||||||
if arraySize > max {
|
if arraySize > max {
|
||||||
arraySize = max
|
arraySize = max
|
||||||
}
|
}
|
||||||
elemType := reflect.TypeOf("string")
|
stringArray := reflect.MakeSlice(reflect.SliceOf(reflect.TypeOf("string")), int(arraySize), int(arraySize))
|
||||||
stringArray := reflect.MakeSlice(reflect.SliceOf(elemType), int(arraySize), int(arraySize))
|
if f.position+arraySize >= f.dataTotal {
|
||||||
if f.position+arraySize >= uint32(len(f.data)) {
|
return stringArray, errors.New("could not make string array")
|
||||||
return stringArray, errors.New("Could not make string array")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := 0; i < int(arraySize); i++ {
|
for i := 0; i < int(arraySize); i++ {
|
||||||
stringSize := uint32(f.data[f.position])
|
stringSize := uint32(f.data[f.position])
|
||||||
|
if f.position+stringSize >= f.dataTotal {
|
||||||
if f.position+stringSize >= uint32(len(f.data)) {
|
|
||||||
return stringArray, nil
|
return stringArray, nil
|
||||||
}
|
}
|
||||||
stringToAppend := string(f.data[f.position : f.position+stringSize])
|
stringToAppend := string(f.data[f.position : f.position+stringSize])
|
||||||
strVal := reflect.ValueOf(stringToAppend)
|
strVal := reflect.ValueOf(stringToAppend)
|
||||||
stringArray = reflect.Append(stringArray, strVal)
|
stringArray = reflect.Append(stringArray, strVal)
|
||||||
f.position = f.position + stringSize
|
f.position += stringSize
|
||||||
}
|
}
|
||||||
return stringArray, nil
|
return stringArray, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *ConsumeFuzzer) GetInt() (int, error) {
|
func (f *ConsumeFuzzer) GetInt() (int, error) {
|
||||||
if f.position >= uint32(len(f.data)) {
|
if f.position >= f.dataTotal {
|
||||||
return 0, errors.New("Not enough bytes to create int")
|
return 0, errors.New("not enough bytes to create int")
|
||||||
}
|
}
|
||||||
returnInt := int(f.data[f.position])
|
returnInt := int(f.data[f.position])
|
||||||
f.position++
|
f.position++
|
||||||
@ -365,29 +324,23 @@ func (f *ConsumeFuzzer) GetInt() (int, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (f *ConsumeFuzzer) GetByte() (byte, error) {
|
func (f *ConsumeFuzzer) GetByte() (byte, error) {
|
||||||
if len(f.data) == 0 {
|
if f.position >= f.dataTotal {
|
||||||
return 0x00, errors.New("Not enough bytes to get byte")
|
return 0x00, errors.New("not enough bytes to get byte")
|
||||||
}
|
|
||||||
if f.position >= uint32(len(f.data)) {
|
|
||||||
return 0x00, errors.New("Not enough bytes to get byte")
|
|
||||||
}
|
}
|
||||||
returnByte := f.data[f.position]
|
returnByte := f.data[f.position]
|
||||||
f.position += 1
|
f.position++
|
||||||
return returnByte, nil
|
return returnByte, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *ConsumeFuzzer) GetNBytes(numberOfBytes int) ([]byte, error) {
|
func (f *ConsumeFuzzer) GetNBytes(numberOfBytes int) ([]byte, error) {
|
||||||
returnBytes := make([]byte, 0)
|
if f.position >= f.dataTotal {
|
||||||
if len(f.data) == 0 {
|
return nil, errors.New("not enough bytes to get byte")
|
||||||
return returnBytes, errors.New("Not enough bytes to get byte")
|
|
||||||
}
|
|
||||||
if f.position >= uint32(len(f.data)) {
|
|
||||||
return returnBytes, errors.New("Not enough bytes to get byte")
|
|
||||||
}
|
}
|
||||||
|
returnBytes := make([]byte, 0, numberOfBytes)
|
||||||
for i := 0; i < numberOfBytes; i++ {
|
for i := 0; i < numberOfBytes; i++ {
|
||||||
newByte, err := f.GetByte()
|
newByte, err := f.GetByte()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return returnBytes, err
|
return nil, err
|
||||||
}
|
}
|
||||||
returnBytes = append(returnBytes, newByte)
|
returnBytes = append(returnBytes, newByte)
|
||||||
}
|
}
|
||||||
@ -397,112 +350,104 @@ func (f *ConsumeFuzzer) GetNBytes(numberOfBytes int) ([]byte, error) {
|
|||||||
func (f *ConsumeFuzzer) GetUint16() (uint16, error) {
|
func (f *ConsumeFuzzer) GetUint16() (uint16, error) {
|
||||||
u16, err := f.GetNBytes(2)
|
u16, err := f.GetNBytes(2)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return uint16(0), err
|
return 0, err
|
||||||
}
|
}
|
||||||
littleEndian, err := f.GetBool()
|
littleEndian, err := f.GetBool()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return uint16(0), err
|
return 0, err
|
||||||
}
|
}
|
||||||
if littleEndian {
|
if littleEndian {
|
||||||
u16LE := binary.LittleEndian.Uint16(u16)
|
return binary.LittleEndian.Uint16(u16), nil
|
||||||
return u16LE, nil
|
|
||||||
}
|
}
|
||||||
u16BE := binary.BigEndian.Uint16(u16)
|
return binary.BigEndian.Uint16(u16), nil
|
||||||
return u16BE, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *ConsumeFuzzer) GetUint32() (uint32, error) {
|
func (f *ConsumeFuzzer) GetUint32() (uint32, error) {
|
||||||
u32, err := f.GetNBytes(4)
|
u32, err := f.GetNBytes(4)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return uint32(0), err
|
return 0, err
|
||||||
}
|
}
|
||||||
littleEndian, err := f.GetBool()
|
littleEndian, err := f.GetBool()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return uint32(0), err
|
return 0, err
|
||||||
}
|
}
|
||||||
if littleEndian {
|
if littleEndian {
|
||||||
u32LE := binary.LittleEndian.Uint32(u32)
|
return binary.LittleEndian.Uint32(u32), nil
|
||||||
return u32LE, nil
|
|
||||||
}
|
}
|
||||||
u32BE := binary.BigEndian.Uint32(u32)
|
return binary.BigEndian.Uint32(u32), nil
|
||||||
return u32BE, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *ConsumeFuzzer) GetUint64() (uint64, error) {
|
func (f *ConsumeFuzzer) GetUint64() (uint64, error) {
|
||||||
u64, err := f.GetNBytes(8)
|
u64, err := f.GetNBytes(8)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return uint64(0), err
|
return 0, err
|
||||||
}
|
}
|
||||||
littleEndian, err := f.GetBool()
|
littleEndian, err := f.GetBool()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return uint64(0), err
|
return 0, err
|
||||||
}
|
}
|
||||||
if littleEndian {
|
if littleEndian {
|
||||||
u64LE := binary.LittleEndian.Uint64(u64)
|
return binary.LittleEndian.Uint64(u64), nil
|
||||||
return u64LE, nil
|
|
||||||
}
|
}
|
||||||
u64BE := binary.BigEndian.Uint64(u64)
|
return binary.BigEndian.Uint64(u64), nil
|
||||||
return u64BE, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *ConsumeFuzzer) GetBytes() ([]byte, error) {
|
func (f *ConsumeFuzzer) GetBytes() ([]byte, error) {
|
||||||
if len(f.data) == 0 || f.position >= uint32(len(f.data)) {
|
if f.position >= f.dataTotal {
|
||||||
return nil, errors.New("Not enough bytes to create byte array")
|
return nil, errors.New("not enough bytes to create byte array")
|
||||||
}
|
}
|
||||||
length, err := f.GetUint32()
|
length, err := f.GetUint32()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.New("Not enough bytes to create byte array")
|
return nil, errors.New("not enough bytes to create byte array")
|
||||||
}
|
}
|
||||||
if f.position+length > MaxTotalLen {
|
if f.position+length > MaxTotalLen {
|
||||||
return nil, errors.New("Created too large a string")
|
return nil, errors.New("created too large a string")
|
||||||
}
|
}
|
||||||
byteBegin := f.position - 1
|
byteBegin := f.position - 1
|
||||||
if byteBegin >= uint32(len(f.data)) {
|
if byteBegin >= f.dataTotal {
|
||||||
return nil, errors.New("Not enough bytes to create byte array")
|
return nil, errors.New("not enough bytes to create byte array")
|
||||||
}
|
}
|
||||||
if length == 0 {
|
if length == 0 {
|
||||||
return nil, errors.New("Zero-length is not supported")
|
return nil, errors.New("zero-length is not supported")
|
||||||
}
|
}
|
||||||
if byteBegin+length >= uint32(len(f.data)) {
|
if byteBegin+length >= f.dataTotal {
|
||||||
return nil, errors.New("Not enough bytes to create byte array")
|
return nil, errors.New("not enough bytes to create byte array")
|
||||||
}
|
}
|
||||||
if byteBegin+length < byteBegin {
|
if byteBegin+length < byteBegin {
|
||||||
return nil, errors.New("Nunmbers overflow. Returning")
|
return nil, errors.New("numbers overflow")
|
||||||
}
|
}
|
||||||
b := f.data[byteBegin : byteBegin+length]
|
|
||||||
f.position = byteBegin + length
|
f.position = byteBegin + length
|
||||||
return b, nil
|
return f.data[byteBegin:f.position], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *ConsumeFuzzer) GetString() (string, error) {
|
func (f *ConsumeFuzzer) GetString() (string, error) {
|
||||||
if f.position >= uint32(len(f.data)) {
|
if f.position >= f.dataTotal {
|
||||||
return "nil", errors.New("Not enough bytes to create string")
|
return "nil", errors.New("not enough bytes to create string")
|
||||||
}
|
}
|
||||||
length, err := f.GetUint32()
|
length, err := f.GetUint32()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "nil", errors.New("Not enough bytes to create string")
|
return "nil", errors.New("not enough bytes to create string")
|
||||||
}
|
}
|
||||||
if f.position > MaxTotalLen {
|
if f.position > MaxTotalLen {
|
||||||
return "nil", errors.New("Created too large a string")
|
return "nil", errors.New("created too large a string")
|
||||||
}
|
}
|
||||||
byteBegin := f.position - 1
|
byteBegin := f.position - 1
|
||||||
if byteBegin >= uint32(len(f.data)) {
|
if byteBegin >= f.dataTotal {
|
||||||
return "nil", errors.New("Not enough bytes to create string")
|
return "nil", errors.New("not enough bytes to create string")
|
||||||
}
|
}
|
||||||
if byteBegin+length > uint32(len(f.data)) {
|
if byteBegin+length > f.dataTotal {
|
||||||
return "nil", errors.New("Not enough bytes to create string")
|
return "nil", errors.New("not enough bytes to create string")
|
||||||
}
|
}
|
||||||
if byteBegin > byteBegin+length {
|
if byteBegin > byteBegin+length {
|
||||||
return "nil", errors.New("Numbers overflow. Returning")
|
return "nil", errors.New("numbers overflow")
|
||||||
}
|
}
|
||||||
str := string(f.data[byteBegin : byteBegin+length])
|
|
||||||
f.position = byteBegin + length
|
f.position = byteBegin + length
|
||||||
return str, nil
|
return string(f.data[byteBegin:f.position]), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *ConsumeFuzzer) GetBool() (bool, error) {
|
func (f *ConsumeFuzzer) GetBool() (bool, error) {
|
||||||
if f.position >= uint32(len(f.data)) {
|
if f.position >= f.dataTotal {
|
||||||
return false, errors.New("Not enough bytes to create bool")
|
return false, errors.New("not enough bytes to create bool")
|
||||||
}
|
}
|
||||||
if IsDivisibleBy(int(f.data[f.position]), 2) {
|
if IsDivisibleBy(int(f.data[f.position]), 2) {
|
||||||
f.position++
|
f.position++
|
||||||
@ -514,20 +459,13 @@ func (f *ConsumeFuzzer) GetBool() (bool, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (f *ConsumeFuzzer) FuzzMap(m interface{}) error {
|
func (f *ConsumeFuzzer) FuzzMap(m interface{}) error {
|
||||||
err := f.GenerateStruct(m)
|
return f.GenerateStruct(m)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func returnTarBytes(buf []byte) ([]byte, error) {
|
func returnTarBytes(buf []byte) ([]byte, error) {
|
||||||
reader := bytes.NewReader(buf)
|
|
||||||
tr := tar.NewReader(reader)
|
|
||||||
|
|
||||||
// Count files
|
// Count files
|
||||||
var fileCounter int
|
var fileCounter int
|
||||||
fileCounter = 0
|
tr := tar.NewReader(bytes.NewReader(buf))
|
||||||
for {
|
for {
|
||||||
_, err := tr.Next()
|
_, err := tr.Next()
|
||||||
if err == io.EOF {
|
if err == io.EOF {
|
||||||
@ -541,7 +479,7 @@ func returnTarBytes(buf []byte) ([]byte, error) {
|
|||||||
if fileCounter > 4 {
|
if fileCounter > 4 {
|
||||||
return buf, nil
|
return buf, nil
|
||||||
}
|
}
|
||||||
return nil, fmt.Errorf("Not enough files were created\n")
|
return nil, fmt.Errorf("not enough files were created\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
func setTarHeaderFormat(hdr *tar.Header, f *ConsumeFuzzer) error {
|
func setTarHeaderFormat(hdr *tar.Header, f *ConsumeFuzzer) error {
|
||||||
@ -609,94 +547,77 @@ func setTarHeaderTypeflag(hdr *tar.Header, f *ConsumeFuzzer) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (f *ConsumeFuzzer) createTarFileBody() ([]byte, error) {
|
func (f *ConsumeFuzzer) createTarFileBody() ([]byte, error) {
|
||||||
if len(f.data) == 0 || f.position >= uint32(len(f.data)) {
|
|
||||||
return nil, errors.New("Not enough bytes to create byte array")
|
|
||||||
}
|
|
||||||
length, err := f.GetUint32()
|
length, err := f.GetUint32()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.New("Not enough bytes to create byte array")
|
return nil, errors.New("not enough bytes to create byte array")
|
||||||
}
|
}
|
||||||
|
|
||||||
// A bit of optimization to attempt to create a file body
|
// A bit of optimization to attempt to create a file body
|
||||||
// when we don't have as many bytes left as "length"
|
// when we don't have as many bytes left as "length"
|
||||||
remainingBytes := (uint32(len(f.data)) - f.position)
|
remainingBytes := f.dataTotal - f.position
|
||||||
totalDataLen := uint32(len(f.data))
|
|
||||||
if uint32(len(f.data))-f.position < 50 {
|
|
||||||
if remainingBytes == 0 {
|
if remainingBytes == 0 {
|
||||||
return nil, errors.New("Created too large a string")
|
return nil, errors.New("created too large a string")
|
||||||
}
|
}
|
||||||
|
if remainingBytes < 50 {
|
||||||
length = length % remainingBytes
|
length = length % remainingBytes
|
||||||
} else if len(f.data) < 500 {
|
} else if f.dataTotal < 500 {
|
||||||
if totalDataLen == 0 {
|
length = length % f.dataTotal
|
||||||
return nil, errors.New("Created too large a string")
|
|
||||||
}
|
|
||||||
length = length % totalDataLen
|
|
||||||
}
|
}
|
||||||
if f.position+length > MaxTotalLen {
|
if f.position+length > MaxTotalLen {
|
||||||
return nil, errors.New("Created too large a string")
|
return nil, errors.New("created too large a string")
|
||||||
}
|
}
|
||||||
byteBegin := f.position - 1
|
byteBegin := f.position - 1
|
||||||
if byteBegin >= uint32(len(f.data)) {
|
if byteBegin >= f.dataTotal {
|
||||||
return nil, errors.New("Not enough bytes to create byte array")
|
return nil, errors.New("not enough bytes to create byte array")
|
||||||
}
|
}
|
||||||
if length == 0 {
|
if length == 0 {
|
||||||
return nil, errors.New("Zero-length is not supported")
|
return nil, errors.New("zero-length is not supported")
|
||||||
}
|
}
|
||||||
if byteBegin+length >= uint32(len(f.data)) {
|
if byteBegin+length >= f.dataTotal {
|
||||||
return nil, errors.New("Not enough bytes to create byte array")
|
return nil, errors.New("not enough bytes to create byte array")
|
||||||
}
|
}
|
||||||
if byteBegin+length < byteBegin {
|
if byteBegin+length < byteBegin {
|
||||||
return nil, errors.New("Nunmbers overflow. Returning")
|
return nil, errors.New("numbers overflow")
|
||||||
}
|
}
|
||||||
filebody := f.data[byteBegin : byteBegin+length]
|
|
||||||
f.position = byteBegin + length
|
f.position = byteBegin + length
|
||||||
return filebody, nil
|
return f.data[byteBegin:f.position], nil
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Is similar to GetString(), but creates string based on the length
|
// getTarFileName is similar to GetString(), but creates string based
|
||||||
// of the length of f.data to increase the likelihood of not overflowing
|
// on the length of f.data to reduce the likelihood of overflowing
|
||||||
// f.data
|
// f.data.
|
||||||
func (f *ConsumeFuzzer) getTarFilename() (string, error) {
|
func (f *ConsumeFuzzer) getTarFilename() (string, error) {
|
||||||
if f.position >= uint32(len(f.data)) {
|
|
||||||
return "nil", errors.New("Not enough bytes to create string")
|
|
||||||
}
|
|
||||||
length, err := f.GetUint32()
|
length, err := f.GetUint32()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "nil", errors.New("Not enough bytes to create string")
|
return "nil", errors.New("not enough bytes to create string")
|
||||||
}
|
}
|
||||||
|
|
||||||
// A bit of optimization to attempt to create a file name
|
// A bit of optimization to attempt to create a file name
|
||||||
// when we don't have as many bytes left as "length"
|
// when we don't have as many bytes left as "length"
|
||||||
remainingBytes := (uint32(len(f.data)) - f.position)
|
remainingBytes := f.dataTotal - f.position
|
||||||
totalDataLen := uint32(len(f.data))
|
|
||||||
if uint32(len(f.data))-f.position < 50 {
|
|
||||||
if remainingBytes == 0 {
|
if remainingBytes == 0 {
|
||||||
return "nil", errors.New("Created too large a string")
|
return "nil", errors.New("created too large a string")
|
||||||
}
|
}
|
||||||
|
if remainingBytes < 50 {
|
||||||
length = length % remainingBytes
|
length = length % remainingBytes
|
||||||
} else if len(f.data) < 500 {
|
} else if f.dataTotal < 500 {
|
||||||
if totalDataLen == 0 {
|
length = length % f.dataTotal
|
||||||
return "nil", errors.New("Created too large a string")
|
|
||||||
}
|
|
||||||
length = length % totalDataLen
|
|
||||||
}
|
}
|
||||||
if f.position > MaxTotalLen {
|
if f.position > MaxTotalLen {
|
||||||
return "nil", errors.New("Created too large a string")
|
return "nil", errors.New("created too large a string")
|
||||||
}
|
}
|
||||||
byteBegin := f.position - 1
|
byteBegin := f.position - 1
|
||||||
if byteBegin >= uint32(len(f.data)) {
|
if byteBegin >= f.dataTotal {
|
||||||
return "nil", errors.New("Not enough bytes to create string")
|
return "nil", errors.New("not enough bytes to create string")
|
||||||
}
|
}
|
||||||
if byteBegin+length > uint32(len(f.data)) {
|
if byteBegin+length > f.dataTotal {
|
||||||
return "nil", errors.New("Not enough bytes to create string")
|
return "nil", errors.New("not enough bytes to create string")
|
||||||
}
|
}
|
||||||
if byteBegin > byteBegin+length {
|
if byteBegin > byteBegin+length {
|
||||||
return "nil", errors.New("Numbers overflow. Returning")
|
return "nil", errors.New("numbers overflow")
|
||||||
}
|
}
|
||||||
str := string(f.data[byteBegin : byteBegin+length])
|
|
||||||
f.position = byteBegin + length
|
f.position = byteBegin + length
|
||||||
return str, nil
|
return string(f.data[byteBegin:f.position]), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// TarBytes returns valid bytes for a tar archive
|
// TarBytes returns valid bytes for a tar archive
|
||||||
@ -710,7 +631,7 @@ func (f *ConsumeFuzzer) TarBytes() ([]byte, error) {
|
|||||||
tw := tar.NewWriter(&buf)
|
tw := tar.NewWriter(&buf)
|
||||||
defer tw.Close()
|
defer tw.Close()
|
||||||
|
|
||||||
maxNoOfFiles := 1000
|
const maxNoOfFiles = 1000
|
||||||
for i := 0; i < numberOfFiles%maxNoOfFiles; i++ {
|
for i := 0; i < numberOfFiles%maxNoOfFiles; i++ {
|
||||||
filename, err := f.getTarFilename()
|
filename, err := f.getTarFilename()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -720,34 +641,27 @@ func (f *ConsumeFuzzer) TarBytes() ([]byte, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return returnTarBytes(buf.Bytes())
|
return returnTarBytes(buf.Bytes())
|
||||||
}
|
}
|
||||||
hdr := &tar.Header{}
|
|
||||||
|
|
||||||
err = setTarHeaderTypeflag(hdr, f)
|
|
||||||
if err != nil {
|
|
||||||
return returnTarBytes(buf.Bytes())
|
|
||||||
}
|
|
||||||
|
|
||||||
sec, err := f.GetInt()
|
sec, err := f.GetInt()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return returnTarBytes(buf.Bytes())
|
return returnTarBytes(buf.Bytes())
|
||||||
}
|
}
|
||||||
|
|
||||||
nsec, err := f.GetInt()
|
nsec, err := f.GetInt()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return returnTarBytes(buf.Bytes())
|
return returnTarBytes(buf.Bytes())
|
||||||
}
|
}
|
||||||
|
|
||||||
hdr.ModTime = time.Unix(int64(sec), int64(nsec))
|
hdr := &tar.Header{
|
||||||
|
Name: filename,
|
||||||
hdr.Name = filename
|
Size: int64(len(filebody)),
|
||||||
hdr.Size = int64(len(filebody))
|
Mode: 0o600,
|
||||||
hdr.Mode = 0600
|
ModTime: time.Unix(int64(sec), int64(nsec)),
|
||||||
|
}
|
||||||
err = setTarHeaderFormat(hdr, f)
|
if err := setTarHeaderTypeflag(hdr, f); err != nil {
|
||||||
if err != nil {
|
return returnTarBytes(buf.Bytes())
|
||||||
|
}
|
||||||
|
if err := setTarHeaderFormat(hdr, f); err != nil {
|
||||||
return returnTarBytes(buf.Bytes())
|
return returnTarBytes(buf.Bytes())
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := tw.WriteHeader(hdr); err != nil {
|
if err := tw.WriteHeader(hdr); err != nil {
|
||||||
return returnTarBytes(buf.Bytes())
|
return returnTarBytes(buf.Bytes())
|
||||||
}
|
}
|
||||||
@ -758,13 +672,11 @@ func (f *ConsumeFuzzer) TarBytes() ([]byte, error) {
|
|||||||
return returnTarBytes(buf.Bytes())
|
return returnTarBytes(buf.Bytes())
|
||||||
}
|
}
|
||||||
|
|
||||||
// Creates pseudo-random files in rootDir.
|
// CreateFiles creates pseudo-random files in rootDir.
|
||||||
// Will create subdirs and place the files there.
|
// It creates subdirs and places the files there.
|
||||||
// It is the callers responsibility to ensure that
|
// It is the callers responsibility to ensure that
|
||||||
// rootDir exists.
|
// rootDir exists.
|
||||||
func (f *ConsumeFuzzer) CreateFiles(rootDir string) error {
|
func (f *ConsumeFuzzer) CreateFiles(rootDir string) error {
|
||||||
var noOfCreatedFiles int
|
|
||||||
noOfCreatedFiles = 0
|
|
||||||
numberOfFiles, err := f.GetInt()
|
numberOfFiles, err := f.GetInt()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -774,40 +686,35 @@ func (f *ConsumeFuzzer) CreateFiles(rootDir string) error {
|
|||||||
return errors.New("maxNumberOfFiles is nil")
|
return errors.New("maxNumberOfFiles is nil")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var noOfCreatedFiles int
|
||||||
for i := 0; i < maxNumberOfFiles; i++ {
|
for i := 0; i < maxNumberOfFiles; i++ {
|
||||||
// The file to create:
|
// The file to create:
|
||||||
fileName, err := f.GetString()
|
fileName, err := f.GetString()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if noOfCreatedFiles > 0 {
|
if noOfCreatedFiles > 0 {
|
||||||
// If files have been created, we don't return
|
// If files have been created, we don't return an error.
|
||||||
// an error
|
|
||||||
break
|
break
|
||||||
} else {
|
} else {
|
||||||
return errors.New("Could not get fileName")
|
return errors.New("could not get fileName")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var fullFilePath string
|
fullFilePath, err := securejoin.SecureJoin(rootDir, fileName)
|
||||||
fullFilePath, err = securejoin.SecureJoin(rootDir, fileName)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find the subdirectory of the file
|
// Find the subdirectory of the file
|
||||||
subDir := filepath.Dir(fileName)
|
if subDir := filepath.Dir(fileName); subDir != "" && subDir != "." {
|
||||||
if subDir != "" && subDir != "." {
|
// create the dir first; avoid going outside the root dir
|
||||||
// create the dir first
|
|
||||||
|
|
||||||
// Avoid going outside the root dir
|
|
||||||
if strings.Contains(subDir, "../") || (len(subDir) > 0 && subDir[0] == 47) || strings.Contains(subDir, "\\") {
|
if strings.Contains(subDir, "../") || (len(subDir) > 0 && subDir[0] == 47) || strings.Contains(subDir, "\\") {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
dirPath := filepath.Join(rootDir, subDir)
|
|
||||||
dirPath, err := securejoin.SecureJoin(rootDir, subDir)
|
dirPath, err := securejoin.SecureJoin(rootDir, subDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if _, err := os.Stat(dirPath); os.IsNotExist(err) {
|
if _, err := os.Stat(dirPath); os.IsNotExist(err) {
|
||||||
err2 := os.MkdirAll(dirPath, 0777)
|
err2 := os.MkdirAll(dirPath, 0o777)
|
||||||
if err2 != nil {
|
if err2 != nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@ -823,7 +730,7 @@ func (f *ConsumeFuzzer) CreateFiles(rootDir string) error {
|
|||||||
if noOfCreatedFiles > 0 {
|
if noOfCreatedFiles > 0 {
|
||||||
break
|
break
|
||||||
} else {
|
} else {
|
||||||
return errors.New("Could not create the symlink")
|
return errors.New("could not create the symlink")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if createSymlink {
|
if createSymlink {
|
||||||
@ -831,7 +738,10 @@ func (f *ConsumeFuzzer) CreateFiles(rootDir string) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
os.Symlink(symlinkTarget, fullFilePath)
|
err = os.Symlink(symlinkTarget, fullFilePath)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
// stop loop here, since a symlink needs no further action
|
// stop loop here, since a symlink needs no further action
|
||||||
noOfCreatedFiles++
|
noOfCreatedFiles++
|
||||||
continue
|
continue
|
||||||
@ -842,43 +752,35 @@ func (f *ConsumeFuzzer) CreateFiles(rootDir string) error {
|
|||||||
if noOfCreatedFiles > 0 {
|
if noOfCreatedFiles > 0 {
|
||||||
break
|
break
|
||||||
} else {
|
} else {
|
||||||
return errors.New("Could not create the file")
|
return errors.New("could not create the file")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
createdFile, err := os.Create(fullFilePath)
|
err = os.WriteFile(fullFilePath, fileContents, 0o666)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
createdFile.Close()
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
_, err = createdFile.Write(fileContents)
|
|
||||||
if err != nil {
|
|
||||||
createdFile.Close()
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
createdFile.Close()
|
|
||||||
noOfCreatedFiles++
|
noOfCreatedFiles++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns a string that can only consists of characters that are
|
// GetStringFrom returns a string that can only consist of characters
|
||||||
// included in possibleChars. Will return an error if the created
|
// included in possibleChars. It returns an error if the created string
|
||||||
// string does not have the specified length
|
// does not have the specified length.
|
||||||
func (f *ConsumeFuzzer) GetStringFrom(possibleChars string, length int) (string, error) {
|
func (f *ConsumeFuzzer) GetStringFrom(possibleChars string, length int) (string, error) {
|
||||||
returnString := ""
|
if (f.dataTotal - f.position) < uint32(length) {
|
||||||
if (uint32(len(f.data)) - f.position) < uint32(length) {
|
return "", errors.New("not enough bytes to create a string")
|
||||||
return returnString, errors.New("Not enough bytes to create a string")
|
|
||||||
}
|
}
|
||||||
|
output := make([]byte, 0, length)
|
||||||
for i := 0; i < length; i++ {
|
for i := 0; i < length; i++ {
|
||||||
charIndex, err := f.GetInt()
|
charIndex, err := f.GetInt()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return returnString, err
|
return string(output), err
|
||||||
}
|
}
|
||||||
charToAdd := string(possibleChars[charIndex%len(possibleChars)])
|
output = append(output, possibleChars[charIndex%len(possibleChars)])
|
||||||
returnString = fmt.Sprintf(returnString + charToAdd)
|
|
||||||
}
|
}
|
||||||
return returnString, nil
|
return string(output), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *ConsumeFuzzer) GetRune() ([]rune, error) {
|
func (f *ConsumeFuzzer) GetRune() ([]rune, error) {
|
||||||
@ -892,11 +794,11 @@ func (f *ConsumeFuzzer) GetRune() ([]rune, error) {
|
|||||||
func (f *ConsumeFuzzer) GetFloat32() (float32, error) {
|
func (f *ConsumeFuzzer) GetFloat32() (float32, error) {
|
||||||
u32, err := f.GetNBytes(4)
|
u32, err := f.GetNBytes(4)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return float32(0.0), err
|
return 0, err
|
||||||
}
|
}
|
||||||
littleEndian, err := f.GetBool()
|
littleEndian, err := f.GetBool()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return float32(0.0), err
|
return 0, err
|
||||||
}
|
}
|
||||||
if littleEndian {
|
if littleEndian {
|
||||||
u32LE := binary.LittleEndian.Uint32(u32)
|
u32LE := binary.LittleEndian.Uint32(u32)
|
||||||
@ -909,11 +811,11 @@ func (f *ConsumeFuzzer) GetFloat32() (float32, error) {
|
|||||||
func (f *ConsumeFuzzer) GetFloat64() (float64, error) {
|
func (f *ConsumeFuzzer) GetFloat64() (float64, error) {
|
||||||
u64, err := f.GetNBytes(8)
|
u64, err := f.GetNBytes(8)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return float64(0.0), err
|
return 0, err
|
||||||
}
|
}
|
||||||
littleEndian, err := f.GetBool()
|
littleEndian, err := f.GetBool()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return float64(0.0), err
|
return 0, err
|
||||||
}
|
}
|
||||||
if littleEndian {
|
if littleEndian {
|
||||||
u64LE := binary.LittleEndian.Uint64(u64)
|
u64LE := binary.LittleEndian.Uint64(u64)
|
||||||
@ -924,9 +826,5 @@ func (f *ConsumeFuzzer) GetFloat64() (float64, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (f *ConsumeFuzzer) CreateSlice(targetSlice interface{}) error {
|
func (f *ConsumeFuzzer) CreateSlice(targetSlice interface{}) error {
|
||||||
err := f.GenerateStruct(targetSlice)
|
return f.GenerateStruct(targetSlice)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
15
vendor/github.com/AdaLogics/go-fuzz-headers/funcs.go
generated
vendored
15
vendor/github.com/AdaLogics/go-fuzz-headers/funcs.go
generated
vendored
@ -35,23 +35,14 @@ func (f *ConsumeFuzzer) AddFuncs(fuzzFuncs []interface{}) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (f *ConsumeFuzzer) GenerateWithCustom(targetStruct interface{}) error {
|
func (f *ConsumeFuzzer) GenerateWithCustom(targetStruct interface{}) error {
|
||||||
v := reflect.ValueOf(targetStruct)
|
e := reflect.ValueOf(targetStruct).Elem()
|
||||||
e := v.Elem()
|
|
||||||
return f.fuzzStruct(e, true)
|
return f.fuzzStruct(e, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c Continue) GenerateStruct(targetStruct interface{}) error {
|
func (c Continue) GenerateStruct(targetStruct interface{}) error {
|
||||||
err := c.F.GenerateStruct(targetStruct)
|
return c.F.GenerateStruct(targetStruct)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c Continue) GenerateStructWithCustom(targetStruct interface{}) error {
|
func (c Continue) GenerateStructWithCustom(targetStruct interface{}) error {
|
||||||
err := c.F.GenerateWithCustom(targetStruct)
|
return c.F.GenerateWithCustom(targetStruct)
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
80
vendor/github.com/AdaLogics/go-fuzz-headers/sql.go
generated
vendored
80
vendor/github.com/AdaLogics/go-fuzz-headers/sql.go
generated
vendored
@ -16,7 +16,7 @@ func getKeyword(f *ConsumeFuzzer) (string, error) {
|
|||||||
return k, nil
|
return k, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return keywords[0], fmt.Errorf("Could not get a kw")
|
return keywords[0], fmt.Errorf("could not get a kw")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Simple utility function to check if a string
|
// Simple utility function to check if a string
|
||||||
@ -101,7 +101,8 @@ var keywords = []string{
|
|||||||
"vitess_migration", "vitess_migrations", "vitess_replication_status",
|
"vitess_migration", "vitess_migrations", "vitess_replication_status",
|
||||||
"vitess_shards", "vitess_tablets", "vschema", "warnings", "when",
|
"vitess_shards", "vitess_tablets", "vschema", "warnings", "when",
|
||||||
"where", "while", "window", "with", "without", "work", "write", "xor",
|
"where", "while", "window", "with", "without", "work", "write", "xor",
|
||||||
"year", "year_month", "zerofill"}
|
"year", "year_month", "zerofill",
|
||||||
|
}
|
||||||
|
|
||||||
// Keywords that could get an additional keyword
|
// Keywords that could get an additional keyword
|
||||||
var needCustomString = []string{
|
var needCustomString = []string{
|
||||||
@ -131,11 +132,15 @@ var alterTableTokens = [][]string{
|
|||||||
}
|
}
|
||||||
|
|
||||||
var alterTokens = [][]string{
|
var alterTokens = [][]string{
|
||||||
{"DATABASE", "SCHEMA", "DEFINER = ", "EVENT", "FUNCTION", "INSTANCE",
|
{
|
||||||
"LOGFILE GROUP", "PROCEDURE", "SERVER"},
|
"DATABASE", "SCHEMA", "DEFINER = ", "EVENT", "FUNCTION", "INSTANCE",
|
||||||
|
"LOGFILE GROUP", "PROCEDURE", "SERVER",
|
||||||
|
},
|
||||||
{"CUSTOM_FUZZ_STRING"},
|
{"CUSTOM_FUZZ_STRING"},
|
||||||
{"ON SCHEDULE", "ON COMPLETION PRESERVE", "ON COMPLETION NOT PRESERVE",
|
{
|
||||||
"ADD UNDOFILE", "OPTIONS"},
|
"ON SCHEDULE", "ON COMPLETION PRESERVE", "ON COMPLETION NOT PRESERVE",
|
||||||
|
"ADD UNDOFILE", "OPTIONS",
|
||||||
|
},
|
||||||
{"RENAME TO", "INITIAL_SIZE = "},
|
{"RENAME TO", "INITIAL_SIZE = "},
|
||||||
{"ENABLE", "DISABLE", "DISABLE ON SLAVE", "ENGINE"},
|
{"ENABLE", "DISABLE", "DISABLE ON SLAVE", "ENGINE"},
|
||||||
{"COMMENT"},
|
{"COMMENT"},
|
||||||
@ -150,9 +155,11 @@ var setTokens = [][]string{
|
|||||||
|
|
||||||
var dropTokens = [][]string{
|
var dropTokens = [][]string{
|
||||||
{"TEMPORARY", "UNDO"},
|
{"TEMPORARY", "UNDO"},
|
||||||
{"DATABASE", "SCHEMA", "EVENT", "INDEX", "LOGFILE GROUP",
|
{
|
||||||
|
"DATABASE", "SCHEMA", "EVENT", "INDEX", "LOGFILE GROUP",
|
||||||
"PROCEDURE", "FUNCTION", "SERVER", "SPATIAL REFERENCE SYSTEM",
|
"PROCEDURE", "FUNCTION", "SERVER", "SPATIAL REFERENCE SYSTEM",
|
||||||
"TABLE", "TABLESPACE", "TRIGGER", "VIEW"},
|
"TABLE", "TABLESPACE", "TRIGGER", "VIEW",
|
||||||
|
},
|
||||||
{"IF EXISTS"},
|
{"IF EXISTS"},
|
||||||
{"CUSTOM_FUZZ_STRING"},
|
{"CUSTOM_FUZZ_STRING"},
|
||||||
{"ON", "ENGINE = ", "RESTRICT", "CASCADE"},
|
{"ON", "ENGINE = ", "RESTRICT", "CASCADE"},
|
||||||
@ -172,15 +179,21 @@ var truncateTokens = [][]string{
|
|||||||
|
|
||||||
var createTokens = [][]string{
|
var createTokens = [][]string{
|
||||||
{"OR REPLACE", "TEMPORARY", "UNDO"}, // For create spatial reference system
|
{"OR REPLACE", "TEMPORARY", "UNDO"}, // For create spatial reference system
|
||||||
{"UNIQUE", "FULLTEXT", "SPATIAL", "ALGORITHM = UNDEFINED", "ALGORITHM = MERGE",
|
{
|
||||||
"ALGORITHM = TEMPTABLE"},
|
"UNIQUE", "FULLTEXT", "SPATIAL", "ALGORITHM = UNDEFINED", "ALGORITHM = MERGE",
|
||||||
{"DATABASE", "SCHEMA", "EVENT", "FUNCTION", "INDEX", "LOGFILE GROUP",
|
"ALGORITHM = TEMPTABLE",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"DATABASE", "SCHEMA", "EVENT", "FUNCTION", "INDEX", "LOGFILE GROUP",
|
||||||
"PROCEDURE", "SERVER", "SPATIAL REFERENCE SYSTEM", "TABLE", "TABLESPACE",
|
"PROCEDURE", "SERVER", "SPATIAL REFERENCE SYSTEM", "TABLE", "TABLESPACE",
|
||||||
"TRIGGER", "VIEW"},
|
"TRIGGER", "VIEW",
|
||||||
|
},
|
||||||
{"IF NOT EXISTS"},
|
{"IF NOT EXISTS"},
|
||||||
{"CUSTOM_FUZZ_STRING"},
|
{"CUSTOM_FUZZ_STRING"},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
// For future use.
|
||||||
var updateTokens = [][]string{
|
var updateTokens = [][]string{
|
||||||
{"LOW_PRIORITY"},
|
{"LOW_PRIORITY"},
|
||||||
{"IGNORE"},
|
{"IGNORE"},
|
||||||
@ -189,6 +202,8 @@ var updateTokens = [][]string{
|
|||||||
{"ORDER BY"},
|
{"ORDER BY"},
|
||||||
{"LIMIT"},
|
{"LIMIT"},
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
var replaceTokens = [][]string{
|
var replaceTokens = [][]string{
|
||||||
{"LOW_PRIORITY", "DELAYED"},
|
{"LOW_PRIORITY", "DELAYED"},
|
||||||
{"INTO"},
|
{"INTO"},
|
||||||
@ -196,6 +211,7 @@ var replaceTokens = [][]string{
|
|||||||
{"CUSTOM_FUZZ_STRING"},
|
{"CUSTOM_FUZZ_STRING"},
|
||||||
{"VALUES", "VALUE"},
|
{"VALUES", "VALUE"},
|
||||||
}
|
}
|
||||||
|
|
||||||
var loadTokens = [][]string{
|
var loadTokens = [][]string{
|
||||||
{"DATA"},
|
{"DATA"},
|
||||||
{"LOW_PRIORITY", "CONCURRENT", "LOCAL"},
|
{"LOW_PRIORITY", "CONCURRENT", "LOCAL"},
|
||||||
@ -271,22 +287,24 @@ var alter_table_options = []string{
|
|||||||
"COMPACT", "SECONDARY_ENGINE_ATTRIBUTE", "STATS_AUTO_RECALC", "STATS_PERSISTENT",
|
"COMPACT", "SECONDARY_ENGINE_ATTRIBUTE", "STATS_AUTO_RECALC", "STATS_PERSISTENT",
|
||||||
"STATS_SAMPLE_PAGES", "ZLIB", "LZ4", "ENGINE_ATTRIBUTE", "KEY_BLOCK_SIZE", "MAX_ROWS",
|
"STATS_SAMPLE_PAGES", "ZLIB", "LZ4", "ENGINE_ATTRIBUTE", "KEY_BLOCK_SIZE", "MAX_ROWS",
|
||||||
"MIN_ROWS", "PACK_KEYS", "PASSWORD", "COMPRESSION", "CONNECTION", "DIRECTORY",
|
"MIN_ROWS", "PACK_KEYS", "PASSWORD", "COMPRESSION", "CONNECTION", "DIRECTORY",
|
||||||
"DELAY_KEY_WRITE", "ENCRYPTION", "STORAGE", "DISK", "MEMORY", "UNION"}
|
"DELAY_KEY_WRITE", "ENCRYPTION", "STORAGE", "DISK", "MEMORY", "UNION",
|
||||||
|
}
|
||||||
|
|
||||||
// Creates an 'alter table' statement. 'alter table' is an exception
|
// Creates an 'alter table' statement. 'alter table' is an exception
|
||||||
// in that it has its own function. The majority of statements
|
// in that it has its own function. The majority of statements
|
||||||
// are created by 'createStmt()'.
|
// are created by 'createStmt()'.
|
||||||
func createAlterTableStmt(f *ConsumeFuzzer) (string, error) {
|
func createAlterTableStmt(f *ConsumeFuzzer) (string, error) {
|
||||||
var stmt strings.Builder
|
|
||||||
stmt.WriteString("ALTER TABLE ")
|
|
||||||
maxArgs, err := f.GetInt()
|
maxArgs, err := f.GetInt()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
maxArgs = maxArgs % 30
|
maxArgs = maxArgs % 30
|
||||||
if maxArgs == 0 {
|
if maxArgs == 0 {
|
||||||
return "", fmt.Errorf("Could not create alter table stmt")
|
return "", fmt.Errorf("could not create alter table stmt")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var stmt strings.Builder
|
||||||
|
stmt.WriteString("ALTER TABLE ")
|
||||||
for i := 0; i < maxArgs; i++ {
|
for i := 0; i < maxArgs; i++ {
|
||||||
// Calculate if we get existing token or custom string
|
// Calculate if we get existing token or custom string
|
||||||
tokenType, err := f.GetInt()
|
tokenType, err := f.GetInt()
|
||||||
@ -298,13 +316,13 @@ func createAlterTableStmt(f *ConsumeFuzzer) (string, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
stmt.WriteString(fmt.Sprintf(" %s", customString))
|
stmt.WriteString(" " + customString)
|
||||||
} else {
|
} else {
|
||||||
tokenIndex, err := f.GetInt()
|
tokenIndex, err := f.GetInt()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
stmt.WriteString(fmt.Sprintf(" %s", alter_table_options[tokenIndex%len(alter_table_options)]))
|
stmt.WriteString(" " + alter_table_options[tokenIndex%len(alter_table_options)])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return stmt.String(), nil
|
return stmt.String(), nil
|
||||||
@ -316,7 +334,7 @@ func chooseToken(tokens []string, f *ConsumeFuzzer) (string, error) {
|
|||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
var token strings.Builder
|
var token strings.Builder
|
||||||
token.WriteString(fmt.Sprintf(" %s", tokens[index%len(tokens)]))
|
token.WriteString(tokens[index%len(tokens)])
|
||||||
if token.String() == "CUSTOM_FUZZ_STRING" {
|
if token.String() == "CUSTOM_FUZZ_STRING" {
|
||||||
customFuzzString, err := f.GetString()
|
customFuzzString, err := f.GetString()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -331,7 +349,7 @@ func chooseToken(tokens []string, f *ConsumeFuzzer) (string, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
token.WriteString(fmt.Sprintf(" %s", customFuzzString))
|
token.WriteString(" " + customFuzzString)
|
||||||
}
|
}
|
||||||
return token.String(), nil
|
return token.String(), nil
|
||||||
}
|
}
|
||||||
@ -398,21 +416,19 @@ func createStmt(f *ConsumeFuzzer) (string, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
query.WriteString(fmt.Sprintf(" %s", queryArgs))
|
query.WriteString(" " + queryArgs)
|
||||||
return query.String(), nil
|
return query.String(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Creates the arguments of a statements. In a select statement
|
// Creates the arguments of a statements. In a select statement
|
||||||
// that would be everything after "select".
|
// that would be everything after "select".
|
||||||
func createStmtArgs(tokenslice [][]string, f *ConsumeFuzzer) (string, error) {
|
func createStmtArgs(tokenslice [][]string, f *ConsumeFuzzer) (string, error) {
|
||||||
var query strings.Builder
|
var query, token strings.Builder
|
||||||
var token strings.Builder
|
|
||||||
|
|
||||||
// We go through the tokens in the tokenslice,
|
// We go through the tokens in the tokenslice,
|
||||||
// create the respective token and add it to
|
// create the respective token and add it to
|
||||||
// "query"
|
// "query"
|
||||||
for _, tokens := range tokenslice {
|
for _, tokens := range tokenslice {
|
||||||
|
|
||||||
// For extra randomization, the fuzzer can
|
// For extra randomization, the fuzzer can
|
||||||
// choose to not include this token.
|
// choose to not include this token.
|
||||||
includeThisToken, err := f.GetBool()
|
includeThisToken, err := f.GetBool()
|
||||||
@ -429,7 +445,7 @@ func createStmtArgs(tokenslice [][]string, f *ConsumeFuzzer) (string, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
query.WriteString(fmt.Sprintf(" %s", chosenToken))
|
query.WriteString(" " + chosenToken)
|
||||||
} else {
|
} else {
|
||||||
token.WriteString(tokens[0])
|
token.WriteString(tokens[0])
|
||||||
|
|
||||||
@ -440,7 +456,7 @@ func createStmtArgs(tokenslice [][]string, f *ConsumeFuzzer) (string, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
query.WriteString(fmt.Sprintf(" %s", customFuzzString))
|
query.WriteString(" " + customFuzzString)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -470,7 +486,7 @@ func createQuery(f *ConsumeFuzzer) (string, error) {
|
|||||||
}
|
}
|
||||||
maxLen := queryLen % 60
|
maxLen := queryLen % 60
|
||||||
if maxLen == 0 {
|
if maxLen == 0 {
|
||||||
return "", fmt.Errorf("Could not create a query")
|
return "", fmt.Errorf("could not create a query")
|
||||||
}
|
}
|
||||||
var query strings.Builder
|
var query strings.Builder
|
||||||
for i := 0; i < maxLen; i++ {
|
for i := 0; i < maxLen; i++ {
|
||||||
@ -484,23 +500,25 @@ func createQuery(f *ConsumeFuzzer) (string, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
query.WriteString(fmt.Sprintf(" %s", keyword))
|
query.WriteString(" " + keyword)
|
||||||
} else {
|
} else {
|
||||||
customString, err := f.GetString()
|
customString, err := f.GetString()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
query.WriteString(fmt.Sprintf(" %s", customString))
|
query.WriteString(" " + customString)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if query.String() == "" {
|
if query.String() == "" {
|
||||||
return "", fmt.Errorf("Could not create a query")
|
return "", fmt.Errorf("could not create a query")
|
||||||
}
|
}
|
||||||
return query.String(), nil
|
return query.String(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is the API that users will interact with.
|
// GetSQLString is the API that users interact with.
|
||||||
|
//
|
||||||
// Usage:
|
// Usage:
|
||||||
|
//
|
||||||
// f := NewConsumer(data)
|
// f := NewConsumer(data)
|
||||||
// sqlString, err := f.GetSQLString()
|
// sqlString, err := f.GetSQLString()
|
||||||
func (f *ConsumeFuzzer) GetSQLString() (string, error) {
|
func (f *ConsumeFuzzer) GetSQLString() (string, error) {
|
||||||
|
4
vendor/modules.txt
vendored
4
vendor/modules.txt
vendored
@ -1,7 +1,7 @@
|
|||||||
# cloud.google.com/go/compute/metadata v0.2.1
|
# cloud.google.com/go/compute/metadata v0.2.1
|
||||||
## explicit; go 1.19
|
## explicit; go 1.19
|
||||||
# github.com/AdaLogics/go-fuzz-headers v0.0.0-20221103172237-443f56ff4ba8
|
# github.com/AdaLogics/go-fuzz-headers v0.0.0-20221118232415-3345c89a7c72
|
||||||
## explicit; go 1.13
|
## explicit; go 1.18
|
||||||
github.com/AdaLogics/go-fuzz-headers
|
github.com/AdaLogics/go-fuzz-headers
|
||||||
# github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20220912195655-e1f97a00006b
|
# github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20220912195655-e1f97a00006b
|
||||||
## explicit; go 1.18
|
## explicit; go 1.18
|
||||||
|
Loading…
Reference in New Issue
Block a user