fix: gracefully handling hid receiver disconnection

This commit is contained in:
evilsocket 2019-03-30 16:27:56 +01:00
parent afe300cd8a
commit 0113286b4f
No known key found for this signature in database
GPG key ID: 1564D7F30393A456
2 changed files with 23 additions and 1 deletions

View file

@ -204,11 +204,21 @@ func (mod *HIDRecon) Configure() error {
return nil
}
func (mod *HIDRecon) forceStop() error {
return mod.SetRunning(false, func() {
if mod.dongle != nil {
mod.dongle.Close()
mod.dongle = nil
mod.Debug("device closed")
}
})
}
func (mod *HIDRecon) Stop() error {
return mod.SetRunning(false, func() {
mod.waitGroup.Wait()
if mod.dongle != nil {
mod.dongle.Close()
mod.dongle = nil
mod.Debug("device closed")
}
})

View file

@ -4,6 +4,7 @@ import (
"time"
"github.com/bettercap/nrf24"
"github.com/google/gousb"
)
func (mod *HIDRecon) doHopping() {
@ -26,7 +27,13 @@ func (mod *HIDRecon) doHopping() {
mod.channel = 1
}
if err := mod.dongle.SetChannel(mod.channel); err != nil {
if err == gousb.ErrorNoDevice {
mod.Error("device disconnected, stopping module")
mod.forceStop()
return
} else {
mod.Warning("error hopping on channel %d: %v", mod.channel, err)
}
} else {
mod.lastHop = time.Now()
}
@ -107,6 +114,11 @@ func (mod *HIDRecon) Start() error {
buf, err := mod.dongle.ReceivePayload()
if err != nil {
if err == gousb.ErrorNoDevice {
mod.Error("device disconnected, stopping module")
mod.forceStop()
return
}
mod.Warning("error receiving payload from channel %d: %v", mod.channel, err)
continue
}