mirror of
https://github.com/bettercap/bettercap
synced 2025-07-31 04:00:09 -07:00
fix: fixing pcap handles w/r ops synchronization here and there (ref #88)
This commit is contained in:
parent
b2e559a206
commit
781437fe6f
4 changed files with 43 additions and 27 deletions
|
@ -32,6 +32,7 @@ type DHCP6Spoofer struct {
|
||||||
Domains []string
|
Domains []string
|
||||||
RawDomains []byte
|
RawDomains []byte
|
||||||
waitGroup *sync.WaitGroup
|
waitGroup *sync.WaitGroup
|
||||||
|
pktSourceChan chan gopacket.Packet
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewDHCP6Spoofer(s *session.Session) *DHCP6Spoofer {
|
func NewDHCP6Spoofer(s *session.Session) *DHCP6Spoofer {
|
||||||
|
@ -360,13 +361,12 @@ func (s *DHCP6Spoofer) Start() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
return s.SetRunning(true, func() {
|
return s.SetRunning(true, func() {
|
||||||
defer s.Handle.Close()
|
|
||||||
|
|
||||||
s.waitGroup.Add(1)
|
s.waitGroup.Add(1)
|
||||||
defer s.waitGroup.Done()
|
defer s.waitGroup.Done()
|
||||||
|
|
||||||
src := gopacket.NewPacketSource(s.Handle, s.Handle.LinkType())
|
src := gopacket.NewPacketSource(s.Handle, s.Handle.LinkType())
|
||||||
for packet := range src.Packets() {
|
s.pktSourceChan = src.Packets()
|
||||||
|
for packet := range s.pktSourceChan {
|
||||||
if s.Running() == false {
|
if s.Running() == false {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -378,6 +378,7 @@ func (s *DHCP6Spoofer) Start() error {
|
||||||
|
|
||||||
func (s *DHCP6Spoofer) Stop() error {
|
func (s *DHCP6Spoofer) Stop() error {
|
||||||
return s.SetRunning(false, func() {
|
return s.SetRunning(false, func() {
|
||||||
|
s.pktSourceChan <- nil
|
||||||
s.Handle.Close()
|
s.Handle.Close()
|
||||||
s.waitGroup.Wait()
|
s.waitGroup.Wait()
|
||||||
})
|
})
|
||||||
|
|
|
@ -24,6 +24,7 @@ type DNSSpoofer struct {
|
||||||
Address net.IP
|
Address net.IP
|
||||||
All bool
|
All bool
|
||||||
waitGroup *sync.WaitGroup
|
waitGroup *sync.WaitGroup
|
||||||
|
pktSourceChan chan gopacket.Packet
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewDNSSpoofer(s *session.Session) *DNSSpoofer {
|
func NewDNSSpoofer(s *session.Session) *DNSSpoofer {
|
||||||
|
@ -273,10 +274,9 @@ func (s *DNSSpoofer) Start() error {
|
||||||
s.waitGroup.Add(1)
|
s.waitGroup.Add(1)
|
||||||
defer s.waitGroup.Done()
|
defer s.waitGroup.Done()
|
||||||
|
|
||||||
defer s.Handle.Close()
|
|
||||||
|
|
||||||
src := gopacket.NewPacketSource(s.Handle, s.Handle.LinkType())
|
src := gopacket.NewPacketSource(s.Handle, s.Handle.LinkType())
|
||||||
for packet := range src.Packets() {
|
s.pktSourceChan = src.Packets()
|
||||||
|
for packet := range s.pktSourceChan {
|
||||||
if s.Running() == false {
|
if s.Running() == false {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -288,6 +288,7 @@ func (s *DNSSpoofer) Start() error {
|
||||||
|
|
||||||
func (s *DNSSpoofer) Stop() error {
|
func (s *DNSSpoofer) Stop() error {
|
||||||
return s.SetRunning(false, func() {
|
return s.SetRunning(false, func() {
|
||||||
|
s.pktSourceChan <- nil
|
||||||
s.Handle.Close()
|
s.Handle.Close()
|
||||||
s.waitGroup.Wait()
|
s.waitGroup.Wait()
|
||||||
})
|
})
|
||||||
|
|
|
@ -16,6 +16,7 @@ type Sniffer struct {
|
||||||
session.SessionModule
|
session.SessionModule
|
||||||
Stats *SnifferStats
|
Stats *SnifferStats
|
||||||
Ctx *SnifferContext
|
Ctx *SnifferContext
|
||||||
|
pktSourceChan chan gopacket.Packet
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewSniffer(s *session.Session) *Sniffer {
|
func NewSniffer(s *session.Session) *Sniffer {
|
||||||
|
@ -148,7 +149,8 @@ func (s *Sniffer) Start() error {
|
||||||
s.Stats = NewSnifferStats()
|
s.Stats = NewSnifferStats()
|
||||||
|
|
||||||
src := gopacket.NewPacketSource(s.Ctx.Handle, s.Ctx.Handle.LinkType())
|
src := gopacket.NewPacketSource(s.Ctx.Handle, s.Ctx.Handle.LinkType())
|
||||||
for packet := range src.Packets() {
|
s.pktSourceChan = src.Packets()
|
||||||
|
for packet := range s.pktSourceChan {
|
||||||
if s.Running() == false {
|
if s.Running() == false {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -183,6 +185,7 @@ func (s *Sniffer) Start() error {
|
||||||
|
|
||||||
func (s *Sniffer) Stop() error {
|
func (s *Sniffer) Stop() error {
|
||||||
return s.SetRunning(false, func() {
|
return s.SetRunning(false, func() {
|
||||||
|
s.pktSourceChan <- nil
|
||||||
s.Ctx.Close()
|
s.Ctx.Close()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,6 +47,8 @@ type Queue struct {
|
||||||
iface *network.Endpoint
|
iface *network.Endpoint
|
||||||
handle *pcap.Handle
|
handle *pcap.Handle
|
||||||
source *gopacket.PacketSource
|
source *gopacket.PacketSource
|
||||||
|
srcChannel chan gopacket.Packet
|
||||||
|
writes *sync.WaitGroup
|
||||||
pktCb PacketCallback
|
pktCb PacketCallback
|
||||||
active bool
|
active bool
|
||||||
}
|
}
|
||||||
|
@ -57,6 +59,7 @@ func NewQueue(iface *network.Endpoint) (q *Queue, err error) {
|
||||||
Traffic: make(map[string]*Traffic),
|
Traffic: make(map[string]*Traffic),
|
||||||
Activities: make(chan Activity),
|
Activities: make(chan Activity),
|
||||||
|
|
||||||
|
writes: &sync.WaitGroup{},
|
||||||
iface: iface,
|
iface: iface,
|
||||||
active: !iface.IsMonitor(),
|
active: !iface.IsMonitor(),
|
||||||
pktCb: nil,
|
pktCb: nil,
|
||||||
|
@ -68,6 +71,7 @@ func NewQueue(iface *network.Endpoint) (q *Queue, err error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
q.source = gopacket.NewPacketSource(q.handle, q.handle.LinkType())
|
q.source = gopacket.NewPacketSource(q.handle, q.handle.LinkType())
|
||||||
|
q.srcChannel = q.source.Packets()
|
||||||
go q.worker()
|
go q.worker()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,7 +142,7 @@ func (q *Queue) trackActivity(eth *layers.Ethernet, ip4 *layers.IPv4, address ne
|
||||||
}
|
}
|
||||||
|
|
||||||
func (q *Queue) worker() {
|
func (q *Queue) worker() {
|
||||||
for pkt := range q.source.Packets() {
|
for pkt := range q.srcChannel {
|
||||||
if q.active == false {
|
if q.active == false {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -192,6 +196,9 @@ func (q *Queue) Send(raw []byte) error {
|
||||||
return fmt.Errorf("Packet queue is not active.")
|
return fmt.Errorf("Packet queue is not active.")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
q.writes.Add(1)
|
||||||
|
defer q.writes.Done()
|
||||||
|
|
||||||
if err := q.handle.WritePacketData(raw); err != nil {
|
if err := q.handle.WritePacketData(raw); err != nil {
|
||||||
q.Stats.Lock()
|
q.Stats.Lock()
|
||||||
q.Stats.Errors++
|
q.Stats.Errors++
|
||||||
|
@ -211,7 +218,11 @@ func (q *Queue) Stop() {
|
||||||
defer q.Unlock()
|
defer q.Unlock()
|
||||||
|
|
||||||
if q.active == true {
|
if q.active == true {
|
||||||
q.handle.Close()
|
// wait for write operations to be completed
|
||||||
|
q.writes.Wait()
|
||||||
|
// signal the main loop to exit and close the handle
|
||||||
q.active = false
|
q.active = false
|
||||||
|
q.srcChannel <- nil
|
||||||
|
q.handle.Close()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue