diff --git a/cmd/fuzz.go b/cmd/fuzz.go index 03074c3..c5f7607 100644 --- a/cmd/fuzz.go +++ b/cmd/fuzz.go @@ -104,19 +104,6 @@ var fuzzCmd = &cobra.Command{ var script *frida.Script = nil hasCrashed := false - go func() { - <-m.DetachCH - sendStats(p, "Unloading script") - if script != nil { - script.Unload() - } - sendStats(p, "Detaching session") - if sess != nil { - sess.Detach() - } - - }() - go func() { if base == "" { sendErr(p, "Base cannot be empty") @@ -154,6 +141,8 @@ var fuzzCmd = &cobra.Command{ var lastInput string sess.On("detached", func(reason frida.SessionDetachReason, crash *frida.Crash) { + // Add sleep here so that we can wait for the context to get cancelled + time.Sleep(3 * time.Second) if hasCrashed { sendStats(p, fmt.Sprintf("Session detached; reason=%s", reason.String())) out := fmt.Sprintf("fcrash_%s_%s", app, crashSHA256(lastInput)) @@ -185,6 +174,7 @@ var fuzzCmd = &cobra.Command{ sendStats(p, "Written session file") } } + p.Send(tui.SessionDetached{}) }) script, err = sess.CreateScript(scriptContent) @@ -216,7 +206,6 @@ var fuzzCmd = &cobra.Command{ ctx, _ := context.WithTimeout(context.Background(), 1*time.Second) if err := script.ExportsCallWithContext(ctx, "fuzz", method, mutated.Input); err == frida.ErrContextCancelled { hasCrashed = true - sess.Detach() break } if timeout > 0 { diff --git a/internal/tui/model.go b/internal/tui/model.go index f021862..954f217 100644 --- a/internal/tui/model.go +++ b/internal/tui/model.go @@ -24,7 +24,6 @@ type Model struct { Base string Input string ValidInputs []string - DetachCH chan struct{} exiting bool start time.Time @@ -55,7 +54,6 @@ func NewModel() Model { m.seconds = 5 m.start = time.Now() - m.DetachCH = make(chan struct{}) return m } @@ -68,7 +66,6 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { case tea.KeyMsg: switch msg.String() { case "ctrl+c", "q": - m.DetachCH <- struct{}{} m.exiting = true return m, m.Tick() } @@ -90,6 +87,9 @@ func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { return m, tea.Quit } return m, m.Tick() + case SessionDetached: + m.exiting = true + return m, m.Tick() } return m, nil