Fixed read from closed channel

A premature waitgroup .Done resulted in reading from closed channel.
This caused a nil-pointer deref & crash.

Added additional debugging when closing routines.
This commit is contained in:
Mathias Hall-Andersen 2018-04-18 20:29:48 +02:00
parent 26a56a652e
commit ac9912345b
4 changed files with 26 additions and 10 deletions

View file

@ -246,8 +246,8 @@ func (peer *Peer) Stop() {
// stop & wait for ongoing peer routines // stop & wait for ongoing peer routines
peer.routines.stop.Broadcast()
peer.routines.starting.Wait() peer.routines.starting.Wait()
peer.routines.stop.Broadcast()
peer.routines.stopping.Wait() peer.routines.stopping.Wait()
// stop timers // stop timers

View file

@ -500,8 +500,8 @@ func (peer *Peer) RoutineSequentialReceiver() {
logError := device.log.Error logError := device.log.Error
logDebug := device.log.Debug logDebug := device.log.Debug
func() { defer func() {
defer peer.routines.stopping.Done() peer.routines.stopping.Done()
logDebug.Println(peer.String(), ": Routine, Sequential Receiver, Stopped") logDebug.Println(peer.String(), ": Routine, Sequential Receiver, Stopped")
}() }()
@ -516,7 +516,11 @@ func (peer *Peer) RoutineSequentialReceiver() {
case <-peer.routines.stop.Wait(): case <-peer.routines.stop.Wait():
return return
case elem := <-peer.queue.inbound: case elem, ok := <-peer.queue.inbound:
if !ok {
return
}
// wait for decryption // wait for decryption

14
send.go
View file

@ -320,13 +320,16 @@ func (device *Device) RoutineEncryption() {
*/ */
func (peer *Peer) RoutineSequentialSender() { func (peer *Peer) RoutineSequentialSender() {
defer peer.routines.stopping.Done()
device := peer.device device := peer.device
logDebug := device.log.Debug logDebug := device.log.Debug
logDebug.Println("Routine, sequential sender, started for", peer.String()) logDebug.Println("Routine, sequential sender, started for", peer.String())
defer func() {
peer.routines.stopping.Done()
logDebug.Println(peer.String(), ": Routine, Sequential sender, Stopped")
}()
peer.routines.starting.Done() peer.routines.starting.Done()
for { for {
@ -337,7 +340,12 @@ func (peer *Peer) RoutineSequentialSender() {
"Routine, sequential sender, stopped for", peer.String()) "Routine, sequential sender, stopped for", peer.String())
return return
case elem := <-peer.queue.outbound: case elem, ok := <-peer.queue.outbound:
if !ok {
return
}
elem.mutex.Lock() elem.mutex.Lock()
if elem.IsDropped() { if elem.IsDropped() {
continue continue

View file

@ -183,13 +183,15 @@ func (peer *Peer) sendNewHandshake() error {
func (peer *Peer) RoutineTimerHandler() { func (peer *Peer) RoutineTimerHandler() {
defer peer.routines.stopping.Done()
device := peer.device device := peer.device
logInfo := device.log.Info logInfo := device.log.Info
logDebug := device.log.Debug logDebug := device.log.Debug
logDebug.Println("Routine, timer handler, started for peer", peer.String())
defer func() {
logDebug.Println(peer.String(), ": Routine, Timer handler, Stopped")
peer.routines.stopping.Done()
}()
// reset all timers // reset all timers
@ -205,6 +207,8 @@ func (peer *Peer) RoutineTimerHandler() {
peer.timer.keepalivePersistent.Reset(duration) peer.timer.keepalivePersistent.Reset(duration)
} }
logDebug.Println("Routine, timer handler, started for peer", peer.String())
// signal synchronised setup complete // signal synchronised setup complete
peer.routines.starting.Done() peer.routines.starting.Done()