From 29b04775856b62213d7bc01937641e2db081d707 Mon Sep 17 00:00:00 2001 From: "Jason A. Donenfeld" Date: Thu, 7 Jan 2021 15:56:52 +0100 Subject: device: receive: drain decryption queue before exiting RoutineDecryption It's possible for RoutineSequentialReceiver to try to lock an elem after RoutineDecryption has exited. Before this meant we didn't then unlock the elem, so the whole program deadlocked. As well, it looks like the flush code (which is now potentially unnecessary?) wasn't properly dropping the buffers for the not-already-dropped case. Signed-off-by: Jason A. Donenfeld --- device/receive.go | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'device/receive.go') diff --git a/device/receive.go b/device/receive.go index 4b6f278..0bd22bf 100644 --- a/device/receive.go +++ b/device/receive.go @@ -251,7 +251,20 @@ func (device *Device) RoutineDecryption() { for { select { case <-device.signals.stop: - return + for { + select { + case elem, ok := <-device.queue.decryption: + if ok { + if !elem.IsDropped() { + elem.Drop() + device.PutMessageBuffer(elem.buffer) + } + elem.Unlock() + } + default: + return + } + } case elem, ok := <-device.queue.decryption: -- cgit v1.2.3-59-g8ed1b