fix: fixed a bug in net.sniff and wifi.recon that caused stop operations to hang on pcap_close

This commit is contained in:
evilsocket 2019-01-29 13:47:20 +01:00
commit 44fddfa455
No known key found for this signature in database
GPG key ID: 1564D7F30393A456
3 changed files with 25 additions and 2 deletions

View file

@ -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")
})
}

View file

@ -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
}
}

View file

@ -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