From 561c9a24c676705a292c1047d316fc0f41532f17 Mon Sep 17 00:00:00 2001 From: Patrick Taibel Date: Wed, 4 Sep 2024 12:33:07 +0200 Subject: [PATCH] PROTON-2843: [Go] Fix segfault on settling a message on closed receivers Deliveries can not be settled after the receiver has been freed. Therefore, this adds a check to ensure that the receiver was not closed (which ensures that `Free` has not been called on the link yet) --- go/pkg/electron/receiver.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/go/pkg/electron/receiver.go b/go/pkg/electron/receiver.go index d412ac1eca..49c2a29528 100644 --- a/go/pkg/electron/receiver.go +++ b/go/pkg/electron/receiver.go @@ -28,7 +28,6 @@ import ( ) // Receiver is a Link that receives messages. -// type Receiver interface { Endpoint LinkSettings @@ -201,9 +200,15 @@ type ReceivedMessage struct { // Acknowledge a ReceivedMessage with the given delivery status. func (rm *ReceivedMessage) acknowledge(status uint64) error { - return rm.receiver.(*receiver).engine().Inject(func() { - // Deliveries are valid as long as the connection is, unless settled. - rm.pDelivery.SettleAs(uint64(status)) + return rm.receiver.(*receiver).engine().InjectWait(func() error { + // Deliveries are valid as long as the receiver is, unless settled. + select { + case <-rm.receiver.Done(): + return rm.receiver.Error() + default: + rm.pDelivery.SettleAs(uint64(status)) + } + return nil }) }