fuzz-walker/walker/func.go

63 lines
1.4 KiB
Go
Raw Permalink Normal View History

package walker
import (
"fmt"
"os"
"plugin"
"sync"
)
// RegisterFuzzFunc is for static linking (not plugin) model
func RegisterFuzzFunc(name string, fnc FuzzFunc) error {
ffLock.Lock()
defer ffLock.Unlock()
if _, ok := fuzzfuncs[name]; ok {
// maybe just output a warning and not bail here?
return fmt.Errorf("RegisterFuzzFunc: %q is already registered", name)
}
fuzzfuncs[name] = fnc
return nil
}
func FuncMap() map[string]FuzzFunc {
return fuzzfuncs
}
var fuzzfuncs = map[string]FuzzFunc{}
var ffLock sync.Mutex
// LoadPlugin loads the file path and returns a Fuzzer.
//
// This is only for making a plugin.
func LoadPlugin(path string) (Fuzzer, error) {
p, err := plugin.Open(path)
if err != nil {
return nil, err
}
sym, err := p.Lookup("NewFuzzer")
if err != nil {
return nil, fmt.Errorf("LoadPlugin: %q", err)
}
nf, ok := sym.(func() (Fuzzer, error))
if !ok {
return nil, fmt.Errorf("LoadPlugin: plugin at %q did not provide a NewFuzzer function", path)
}
return nf()
}
// NewFuzzer initializes a new Fuzzer.
//
// This is only for making a plugin.
type NewFuzzer func() (Fuzzer, error)
// Fuzzer is a struct that produces a FuzzFunc.
//
// This is only for making a plugin.
type Fuzzer interface {
Name() string
Func(path string, info os.FileInfo) error
}
// FuzzFunc is like filepath.WalkerFunc, but for poking at `path`
type FuzzFunc func(path string, info os.FileInfo) error