prepping for walkers to be plugins

Signed-off-by: Vincent Batts <vbatts@hashbangbash.com>
This commit is contained in:
Vincent Batts 2018-06-05 17:34:58 -04:00
parent 790ac3077a
commit 339b6145f9
Signed by: vbatts
GPG key ID: 10937E57733F1362
2 changed files with 51 additions and 1 deletions

24
main.go
View file

@ -22,12 +22,36 @@ var (
"writeNum": writeNumFuzz,
}
fuzzTimeout = 500 * time.Millisecond
walkerPlugins []walker.Fuzzer
)
func appInit(c *cli.Context) error {
matches, err := filepath.Glob(c.String("plugins"))
if err != nil {
return err
}
for _, match := range matches {
ff, err := walker.LoadPlugin(match)
if err != nil {
return err
}
walkerPlugins = append(walkerPlugins, ff)
}
return nil
}
func main() {
app := cli.NewApp()
app.Name = "fuzz-walker"
app.Usage = "a walker to poke and prod at /proc and /sys"
app.Before = appInit
app.Flags = []cli.Flag{
cli.StringFlag{
Name: "plugins",
Value: "*.so",
Usage: "pattern to glob walker plugins",
},
}
app.Action = func(c *cli.Context) error {
hasError := false
for _, dir := range dirs {

View file

@ -1,8 +1,34 @@
package walker
import (
"fmt"
"os"
"plugin"
"time"
)
// LoadPlugin loads the file path and returns a Fuzzer
func LoadPlugin(path string) (Fuzzer, error) {
p, err := plugin.Open(path)
if err != nil {
return nil, err
}
sym, err := p.Lookup("MyFuzzerFunc")
if err != nil {
return nil, err
}
mff, ok := sym.(Fuzzer)
if !ok {
return nil, fmt.Errorf("plugin at %q did not provide a FuzzFunc named MyFuzzerFunc", path)
}
return mff, nil
}
// Fuzzer is a struct that produces a FuzzFunc
type Fuzzer interface {
Name() string
Func() FuzzFunc
}
// FuzzFunc is like filepath.WalkerFunc, but for poking at `path`
type FuzzFunc func(path string, info os.FileInfo, timeout time.Duration) error