fix: fixed a race condition

This commit is contained in:
evilsocket 2018-03-22 10:35:42 +01:00
parent e5f598b274
commit ec28d73ba7
No known key found for this signature in database
GPG key ID: 1564D7F30393A456
4 changed files with 32 additions and 38 deletions

View file

@ -19,9 +19,9 @@ func (p *Prober) sendProbeUDP(from net.IP, from_hw net.HardwareAddr, ip net.IP)
wrote, _ := con.Write([]byte{0x00}) wrote, _ := con.Write([]byte{0x00})
if wrote > 0 { if wrote > 0 {
p.Session.Queue.Stats.Lock() p.Session.Queue.TrackSent(uint64(wrote))
p.Session.Queue.Stats.Sent += uint64(wrote) } else {
p.Session.Queue.Stats.Unlock() p.Session.Queue.TrackError()
} }
} }
} }

View file

@ -273,17 +273,6 @@ func (w *WiFiModule) updateStats(dot11 *layers.Dot11, packet gopacket.Packet) {
} }
} }
func (w *WiFiModule) trackPacket(pkt gopacket.Packet) {
pktSize := uint64(len(pkt.Data()))
w.Session.Queue.Stats.Lock()
w.Session.Queue.Stats.PktReceived++
w.Session.Queue.Stats.Received += pktSize
w.Session.Queue.Stats.Unlock()
}
func (w *WiFiModule) Start() error { func (w *WiFiModule) Start() error {
if err := w.Configure(); err != nil { if err := w.Configure(); err != nil {
return err return err
@ -306,13 +295,11 @@ func (w *WiFiModule) Start() error {
for packet := range w.pktSourceChan { for packet := range w.pktSourceChan {
if w.Running() == false { if w.Running() == false {
break break
} } else if packet == nil {
if packet == nil {
continue continue
} }
w.trackPacket(packet) w.Session.Queue.TrackPacket(uint64(len(packet.Data())))
// perform initial dot11 parsing and layers validation // perform initial dot11 parsing and layers validation
if ok, radiotap, dot11 := packets.Dot11Parse(packet); ok == true { if ok, radiotap, dot11 := packets.Dot11Parse(packet); ok == true {

View file

@ -13,14 +13,9 @@ import (
func (w *WiFiModule) injectPacket(data []byte) { func (w *WiFiModule) injectPacket(data []byte) {
if err := w.handle.WritePacketData(data); err != nil { if err := w.handle.WritePacketData(data); err != nil {
log.Error("Could not inject WiFi packet: %s", err) log.Error("Could not inject WiFi packet: %s", err)
w.Session.Queue.TrackError()
w.Session.Queue.Stats.Lock()
w.Session.Queue.Stats.Errors++
w.Session.Queue.Stats.Unlock()
} else { } else {
w.Session.Queue.Stats.Lock() w.Session.Queue.TrackSent(uint64(len(data)))
w.Session.Queue.Stats.Sent += uint64(len(data))
w.Session.Queue.Stats.Unlock()
} }
// let the network card breath a little // let the network card breath a little
time.Sleep(10 * time.Millisecond) time.Sleep(10 * time.Millisecond)

View file

@ -141,6 +141,28 @@ func (q *Queue) trackActivity(eth *layers.Ethernet, ip4 *layers.IPv4, address ne
} }
} }
func (q *Queue) TrackPacket(size uint64) {
q.Stats.Lock()
defer q.Stats.Unlock()
q.Stats.PktReceived++
q.Stats.Received += size
}
func (q *Queue) TrackSent(size uint64) {
q.Stats.Lock()
defer q.Stats.Unlock()
q.Stats.Sent += size
}
func (q *Queue) TrackError() {
q.Stats.Lock()
defer q.Stats.Unlock()
q.Stats.Errors++
}
func (q *Queue) worker() { func (q *Queue) worker() {
for pkt := range q.srcChannel { for pkt := range q.srcChannel {
if q.active == false { if q.active == false {
@ -151,13 +173,7 @@ func (q *Queue) worker() {
pktSize := uint64(len(pkt.Data())) pktSize := uint64(len(pkt.Data()))
q.Stats.Lock() q.TrackPacket(pktSize)
q.Stats.PktReceived++
q.Stats.Received += pktSize
q.Stats.Unlock()
q.onPacketCallback(pkt) q.onPacketCallback(pkt)
// decode eth and ipv4 layers // decode eth and ipv4 layers
@ -200,14 +216,10 @@ func (q *Queue) Send(raw []byte) error {
defer q.writes.Done() defer q.writes.Done()
if err := q.handle.WritePacketData(raw); err != nil { if err := q.handle.WritePacketData(raw); err != nil {
q.Stats.Lock() q.TrackError()
q.Stats.Errors++
q.Stats.Unlock()
return err return err
} else { } else {
q.Stats.Lock() q.TrackSent(uint64(len(raw)))
q.Stats.Sent += uint64(len(raw))
q.Stats.Unlock()
} }
return nil return nil