mirror of
https://github.com/bettercap/bettercap
synced 2025-08-14 02:36:57 -07:00
fix: fixed a bug in net.sniff and wifi.recon that caused stop operations to hang on pcap_close
This commit is contained in:
parent
36a6bb87ce
commit
44fddfa455
3 changed files with 25 additions and 2 deletions
|
@ -4,6 +4,7 @@ import (
|
|||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/bettercap/bettercap/log"
|
||||
"github.com/bettercap/bettercap/session"
|
||||
|
||||
"github.com/google/gopacket"
|
||||
|
@ -170,6 +171,7 @@ func (s *Sniffer) Start() error {
|
|||
s.pktSourceChan = src.Packets()
|
||||
for packet := range s.pktSourceChan {
|
||||
if !s.Running() {
|
||||
log.Debug("end pkt loop (pkt=%v filter='%s')", packet, s.Ctx.Filter)
|
||||
break
|
||||
}
|
||||
|
||||
|
@ -209,9 +211,14 @@ func (s *Sniffer) Start() error {
|
|||
|
||||
func (s *Sniffer) Stop() error {
|
||||
return s.SetRunning(false, func() {
|
||||
log.Debug("stopping sniffer")
|
||||
if s.pktSourceChan != nil {
|
||||
log.Debug("sending nil")
|
||||
s.pktSourceChan <- nil
|
||||
log.Debug("nil sent")
|
||||
}
|
||||
log.Debug("closing ctx")
|
||||
s.Ctx.Close()
|
||||
log.Debug("ctx closed")
|
||||
})
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@ package modules
|
|||
import (
|
||||
"os"
|
||||
"regexp"
|
||||
"time"
|
||||
|
||||
"github.com/bettercap/bettercap/log"
|
||||
"github.com/bettercap/bettercap/session"
|
||||
|
@ -36,7 +37,12 @@ func (s *Sniffer) GetContext() (error, *SnifferContext) {
|
|||
}
|
||||
|
||||
if ctx.Source == "" {
|
||||
if ctx.Handle, err = pcap.OpenLive(s.Session.Interface.Name(), 65536, true, pcap.BlockForever); err != nil {
|
||||
/*
|
||||
* We don't want to pcap.BlockForever otherwise pcap_close(handle)
|
||||
* could hang waiting for a timeout to expire ...
|
||||
*/
|
||||
readTimeout := 500 * time.Millisecond
|
||||
if ctx.Handle, err = pcap.OpenLive(s.Session.Interface.Name(), 65536, true, readTimeout); err != nil {
|
||||
return err, ctx
|
||||
}
|
||||
} else {
|
||||
|
@ -117,12 +123,16 @@ func (c *SnifferContext) Log(sess *session.Session) {
|
|||
|
||||
func (c *SnifferContext) Close() {
|
||||
if c.Handle != nil {
|
||||
log.Debug("closing handle")
|
||||
c.Handle.Close()
|
||||
log.Debug("handle closed")
|
||||
c.Handle = nil
|
||||
}
|
||||
|
||||
if c.OutputFile != nil {
|
||||
log.Debug("closing output")
|
||||
c.OutputFile.Close()
|
||||
log.Debug("output closed")
|
||||
c.OutputFile = nil
|
||||
}
|
||||
}
|
||||
|
|
|
@ -236,7 +236,13 @@ func (w *WiFiModule) Configure() error {
|
|||
return fmt.Errorf("Error while setting interface %s in monitor mode: %s", tui.Bold(w.Session.Interface.Name()), err)
|
||||
} else if err = ihandle.SetSnapLen(65536); err != nil {
|
||||
return err
|
||||
} else if err = ihandle.SetTimeout(pcap.BlockForever); err != nil {
|
||||
}
|
||||
/*
|
||||
* We don't want to pcap.BlockForever otherwise pcap_close(handle)
|
||||
* could hang waiting for a timeout to expire ...
|
||||
*/
|
||||
readTimeout := 500 * time.Millisecond
|
||||
if err = ihandle.SetTimeout(readTimeout); err != nil {
|
||||
return err
|
||||
} else if w.handle, err = ihandle.Activate(); err != nil {
|
||||
return err
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue