Skip to content

Commit 968dbbf

Browse files
committed
all: add /addcandidate rest api to upload new prog as candidate
ex to upload prog to syzkaller: curl -s --noproxy 0.0.0.0 -F "file=@prog" http://0.0.0.0:8888/addcandidate
1 parent 578925b commit 968dbbf

File tree

1 file changed

+41
-0
lines changed

1 file changed

+41
-0
lines changed

pkg/manager/http.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ func (serv *HTTPServer) Serve() {
8181
handle("/vms", serv.httpVMs)
8282
handle("/vm", serv.httpVM)
8383
handle("/metrics", promhttp.HandlerFor(prometheus.DefaultGatherer, promhttp.HandlerOpts{}).ServeHTTP)
84+
handle("/addcandidate", serv.httpAddCandidate)
8485
handle("/syscalls", serv.httpSyscalls)
8586
handle("/corpus", serv.httpCorpus)
8687
handle("/corpus.db", serv.httpDownloadCorpus)
@@ -734,6 +735,46 @@ func (serv *HTTPServer) modulesInfo(w http.ResponseWriter, r *http.Request) {
734735
serv.jsonPage(w, r, "modules", cover.Modules)
735736
}
736737

738+
func (serv *HTTPServer) httpAddCandidate(w http.ResponseWriter, r *http.Request) {
739+
if r.Method != http.MethodPost {
740+
http.Error(w, "only POST method supported", http.StatusMethodNotAllowed)
741+
return
742+
}
743+
err := r.ParseMultipartForm(20 << 20)
744+
if err != nil {
745+
http.Error(w, fmt.Sprintf("failed to parse form: %v", err), http.StatusBadRequest)
746+
return
747+
}
748+
file, _, err := r.FormFile("file")
749+
if err != nil {
750+
http.Error(w, fmt.Sprintf("failed to retrieve file from form-data: %v", err), http.StatusBadRequest)
751+
return
752+
}
753+
defer file.Close()
754+
data, err := io.ReadAll(file)
755+
if err != nil {
756+
http.Error(w, fmt.Sprintf("failed to read file: %v", err), http.StatusBadRequest)
757+
return
758+
}
759+
prog, err := ParseSeed(serv.Cfg.Target, data)
760+
if err != nil {
761+
http.Error(w, fmt.Sprintf("failed to parse seed: %v", err), http.StatusBadRequest)
762+
return
763+
}
764+
if !prog.OnlyContains(serv.Fuzzer.Load().Config.EnabledCalls) {
765+
http.Error(w, "contains disabled syscall", http.StatusBadRequest)
766+
return
767+
}
768+
var flags fuzzer.ProgFlags
769+
flags |= fuzzer.ProgMinimized
770+
flags |= fuzzer.ProgSmashed
771+
candidates := []fuzzer.Candidate{{
772+
Prog: prog,
773+
Flags: flags,
774+
}}
775+
serv.Fuzzer.Load().AddCandidates(candidates)
776+
}
777+
737778
var alphaNumRegExp = regexp.MustCompile(`^[a-zA-Z0-9]*$`)
738779

739780
func isAlphanumeric(s string) bool {

0 commit comments

Comments
 (0)