aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pkg/manager/http.go22
-rw-r--r--syz-manager/manager.go7
2 files changed, 22 insertions, 7 deletions
diff --git a/pkg/manager/http.go b/pkg/manager/http.go
index d78d5dc0e..e8c4728ad 100644
--- a/pkg/manager/http.go
+++ b/pkg/manager/http.go
@@ -5,6 +5,7 @@ package manager
import (
"bytes"
+ "context"
"embed"
"encoding/json"
"fmt"
@@ -67,9 +68,9 @@ type HTTPServer struct {
paused bool
}
-func (serv *HTTPServer) Serve() {
+func (serv *HTTPServer) Serve(ctx context.Context) error {
if serv.Cfg.HTTP == "" {
- log.Fatalf("starting a disabled HTTP server")
+ return fmt.Errorf("starting a disabled HTTP server")
}
if serv.Pool != nil {
serv.Pools = map[string]*vm.Dispatcher{"": serv.Pool}
@@ -110,10 +111,19 @@ func (serv *HTTPServer) Serve() {
handle("/favicon.ico", func(w http.ResponseWriter, r *http.Request) {})
log.Logf(0, "serving http on http://%v", serv.Cfg.HTTP)
- err := http.ListenAndServe(serv.Cfg.HTTP, nil)
- if err != nil {
- log.Fatalf("failed to listen on %v: %v", serv.Cfg.HTTP, err)
- }
+ server := &http.Server{Addr: serv.Cfg.HTTP}
+ go func() {
+ // The http server package unfortunately does not natively take a context.Context.
+ // Let's emulate it via server.Shutdown()
+ <-ctx.Done()
+ server.Close()
+ }()
+
+ err := server.ListenAndServe()
+ if err != http.ErrServerClosed {
+ return err
+ }
+ return nil
}
func (serv *HTTPServer) httpAction(w http.ResponseWriter, r *http.Request) {
diff --git a/syz-manager/manager.go b/syz-manager/manager.go
index fd6be0072..1ea489dd9 100644
--- a/syz-manager/manager.go
+++ b/syz-manager/manager.go
@@ -357,7 +357,12 @@ func RunManager(mode *Mode, cfg *mgrconfig.Config) {
ctx := vm.ShutdownCtx()
if mgr.cfg.HTTP != "" {
- go mgr.http.Serve()
+ go func() {
+ err := mgr.http.Serve(ctx)
+ if err != nil {
+ log.Fatalf("failed to serve HTTP: %v", err)
+ }
+ }()
}
go mgr.trackUsedFiles()
go mgr.processFuzzingResults(ctx)