Skip to content
This repository was archived by the owner on Apr 30, 2021. It is now read-only.

Commit d751518

Browse files
author
Yevgeny Pats
committed
preliminary support for issue: #27
1 parent 80a029e commit d751518

File tree

6 files changed

+61
-29
lines changed

6 files changed

+61
-29
lines changed

client/agent.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,20 @@ func (c *FuzzitClient) RunFuzzer(job Job, jobId string, updateDB bool) error {
135135
if err := c.DownloadAndExtractFuzzer(".", c.currentJob.TargetId, jobId); err != nil {
136136
return err
137137
}
138+
139+
log.Println("downloading additional corpus")
140+
if err := os.Mkdir("additional-corpus", 0644); err != nil {
141+
return err
142+
}
143+
if err := c.downloadAndExtract(
144+
"additional-corpus",
145+
fmt.Sprintf("orgs/%s/targets/%s/jobs/%s/corpus.tar.gz", c.Org, c.currentJob.TargetId, c.jobId)); err != nil {
146+
if err.Error() == "404 Not Found" {
147+
log.Println("no additional-corpus. skipping...")
148+
} else {
149+
return err
150+
}
151+
}
138152
}
139153

140154
var err error

client/client.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
)
1212

1313
const FuzzitEndpoint = "https://app.fuzzit.dev"
14-
const Version = "v2.4.69"
14+
const Version = "v2.4.70"
1515

1616
type Target struct {
1717
Name string `firestore:"target_name"`

client/commands.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ chmod a+x fuzzit
294294
return nil
295295
}
296296

297-
func (c *FuzzitClient) CreateJob(jobConfig Job, files []string) (*firestore.DocumentRef, error) {
297+
func (c *FuzzitClient) CreateJob(jobConfig Job, additionalCorpus string, files []string) (*firestore.DocumentRef, error) {
298298
err := c.refreshToken()
299299
if err != nil {
300300
return nil, err
@@ -343,6 +343,17 @@ func (c *FuzzitClient) CreateJob(jobConfig Job, files []string) (*firestore.Docu
343343
return nil, err
344344
}
345345

346+
if additionalCorpus != "" {
347+
log.Println("Uploading additional corpus...")
348+
err = c.uploadFile(
349+
additionalCorpus,
350+
fmt.Sprintf("orgs/%s/targets/%s/jobs/%s/additional-corpus", c.Org, jobConfig.TargetId, jobRef.ID),
351+
filepath.Base(additionalCorpus))
352+
if err != nil {
353+
return nil, err
354+
}
355+
}
356+
346357
log.Println("Starting job")
347358
_, err = jobRef.Set(ctx, jobConfig)
348359
if err != nil {

client/gofuzz.go

Lines changed: 5 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -67,26 +67,6 @@ func (c *FuzzitClient) loadCurrentCrashes() (map[string]bool, error) {
6767
return uniqueCrashes, err
6868
}
6969

70-
// this merges corpus into workdir
71-
func (c *FuzzitClient) mergeCorpus() error {
72-
err := filepath.Walk("corpus", func(path string, info os.FileInfo, err error) error {
73-
if err != nil {
74-
log.Printf("prevent panic by handling failure accessing a path %q: %v\n", path, err)
75-
return err
76-
}
77-
if !info.IsDir() {
78-
fileName := info.Name()
79-
err = os.Rename("corpus/"+fileName, "workdir/corpus/"+fileName)
80-
if err != nil {
81-
return err
82-
}
83-
}
84-
return nil
85-
})
86-
87-
return err
88-
}
89-
9070
func (c *FuzzitClient) runGoFuzzFuzzing() error {
9171
ctx := context.Background()
9272

@@ -141,8 +121,10 @@ func (c *FuzzitClient) runGoFuzzFuzzing() error {
141121
}
142122
}
143123

144-
err = c.mergeCorpus()
145-
if err != nil {
124+
if err := mergeDirectories("workdir/corpus", "corpus"); err != nil {
125+
log.Fatal(err)
126+
}
127+
if err := mergeDirectories("workdir/corpus", "additional-corpus"); err != nil {
146128
log.Fatal(err)
147129
}
148130

@@ -267,7 +249,7 @@ func (c *FuzzitClient) runGoFuzz() error {
267249
if c.currentJob.Type == "fuzzing" {
268250
err = c.runGoFuzzFuzzing()
269251
} else {
270-
return fmt.Errorf("JQF currently only supports fuzzing")
252+
return fmt.Errorf("go-fuzz currently only supports fuzzing")
271253
}
272254

273255
return err

client/utils.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,3 +171,22 @@ func DownloadFile(filepath string, url string) error {
171171
_, err = io.Copy(out, resp.Body)
172172
return err
173173
}
174+
175+
func mergeDirectories(dst string, src string) error {
176+
err := filepath.Walk(src, func(path string, info os.FileInfo, err error) error {
177+
if err != nil {
178+
log.Printf("prevent panic by handling failure accessing a path %q: %v\n", path, err)
179+
return err
180+
}
181+
if !info.IsDir() {
182+
fileName := info.Name()
183+
err = os.Rename(filepath.Join(src, fileName), filepath.Join(dst, fileName))
184+
if err != nil {
185+
return err
186+
}
187+
}
188+
return nil
189+
})
190+
191+
return err
192+
}

cmd/job.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,11 @@ var jobCmd = &cobra.Command{
9191
log.Fatal(err)
9292
}
9393

94+
additionalCorpus, err := cmd.Flags().GetString("additional-corpus")
95+
if err != nil {
96+
log.Fatal(err)
97+
}
98+
9499
log.Println("Creating job...")
95100

96101
target := args[0]
@@ -111,7 +116,7 @@ var jobCmd = &cobra.Command{
111116
return
112117
}
113118
} else {
114-
_, err = gFuzzitClient.CreateJob(newJob, args[1:])
119+
_, err = gFuzzitClient.CreateJob(newJob, additionalCorpus, args[1:])
115120
}
116121

117122
if err != nil {
@@ -138,13 +143,14 @@ func init() {
138143
branch := client.GetValueFromEnv("TRAVIS_BRANCH", "CIRCLE_BRANCH", "GITHUB_REF")
139144

140145
jobCmd.Flags().StringVar(&newJob.Type, "type", "fuzzing", "fuzzing/regression/local-regression")
141-
jobCmd.Flags().StringVar(&newJob.Engine, "engine", "libfuzzer", "libfuzzer/jqf")
146+
jobCmd.Flags().StringVar(&newJob.Engine, "engine", "libfuzzer", "libfuzzer/jqf/go-fuzz")
142147
jobCmd.Flags().StringVar(&newJob.CPUs, "cpus", "1", "number of cpus to use (only relevant for fuzzing job)")
143148
jobCmd.Flags().StringVar(&newJob.Memory, "memory", "2048Mi", "number of cpus to use (only relevant for fuzzing job)")
144149
jobCmd.Flags().MarkHidden("memory")
145150
jobCmd.Flags().MarkHidden("cpus")
146-
jobCmd.Flags().StringVar(&newJob.Revision, "revision", revision, "Revision tag of fuzzer (populates automatically from git,travis,circleci)")
147-
jobCmd.Flags().StringVar(&newJob.Branch, "branch", branch, "Branch of the fuzzer (populates automatically from git,travis,circleci)")
151+
jobCmd.Flags().StringVar(&newJob.Revision, "revision", revision, "revision tag of fuzzer (populates automatically from git,travis,circleci)")
152+
jobCmd.Flags().StringVar(&newJob.Branch, "branch", branch, "branch of the fuzzer (populates automatically from git,travis,circleci)")
153+
jobCmd.Flags().String("additional-corpus", "", "path to additional corpus for this job (should be a flat zip/tar.gz containing the test cases)")
148154
jobCmd.Flags().StringVar(&newJob.Host, "host", "", "docker image to use when running the fuzzer. Options: stretch-llvm8/stretch-llvm9/bionic-swift51")
149155
jobCmd.Flags().StringArrayVarP(&newJob.EnvironmentVariables, "environment", "e", nil,
150156
"Additional environment variables for the fuzzer. For example ASAN_OPTINOS, UBSAN_OPTIONS or any other")

0 commit comments

Comments
 (0)