From d5692991ce9e6e80371534d7b61c43d82f15cfe1 Mon Sep 17 00:00:00 2001
From: jbhusson <jonah@elixxir.io>
Date: Tue, 28 Jun 2022 17:43:00 -0400
Subject: [PATCH] Potential fix for deadlock

---
 auth/callbacks.go       | 3 +++
 auth/receivedConfirm.go | 2 --
 auth/receivedRequest.go | 6 ------
 auth/state.go           | 2 --
 4 files changed, 3 insertions(+), 10 deletions(-)

diff --git a/auth/callbacks.go b/auth/callbacks.go
index 781164bb8..3c5862e7a 100644
--- a/auth/callbacks.go
+++ b/auth/callbacks.go
@@ -42,6 +42,9 @@ func (p *partnerCallbacks) DeletePartnerCallback(partnerId *id.ID) {
 
 // getPartnerCallback returns the Callbacks for the given partnerId
 func (p *partnerCallbacks) getPartnerCallback(partnerId *id.ID) Callbacks {
+	p.RLock()
+	defer p.RUnlock()
+
 	return p.callbacks[*partnerId]
 }
 
diff --git a/auth/receivedConfirm.go b/auth/receivedConfirm.go
index 538329e1b..bf25d5661 100644
--- a/auth/receivedConfirm.go
+++ b/auth/receivedConfirm.go
@@ -113,13 +113,11 @@ func (rcs *receivedConfirmService) Process(msg format.Message,
 		Facts:          make([]fact.Fact, 0),
 	}
 
-	authState.partnerCallbacks.RLock()
 	if cb := authState.partnerCallbacks.getPartnerCallback(c.ID); cb != nil {
 		cb.Confirm(c, receptionID, round)
 	} else {
 		authState.callbacks.Confirm(c, receptionID, round)
 	}
-	authState.partnerCallbacks.RUnlock()
 }
 
 func (rcs *receivedConfirmService) String() string {
diff --git a/auth/receivedRequest.go b/auth/receivedRequest.go
index b410b04a3..4e3325996 100644
--- a/auth/receivedRequest.go
+++ b/auth/receivedRequest.go
@@ -130,21 +130,17 @@ func (rrs *receivedRequestService) Process(message format.Message,
 			} else if authState.params.ReplayRequests {
 				//if we did not already accept, auto replay the request
 				if rrs.reset {
-					authState.partnerCallbacks.RLock()
 					if cb := authState.partnerCallbacks.getPartnerCallback(c.ID); cb != nil {
 						cb.Reset(c, receptionID, round)
 					} else {
 						authState.callbacks.Reset(c, receptionID, round)
 					}
-					authState.partnerCallbacks.RUnlock()
 				} else {
-					authState.partnerCallbacks.RLock()
 					if cb := authState.partnerCallbacks.getPartnerCallback(c.ID); cb != nil {
 						cb.Request(c, receptionID, round)
 					} else {
 						authState.callbacks.Request(c, receptionID, round)
 					}
-					authState.partnerCallbacks.RUnlock()
 				}
 			}
 			//if not confirm, and params.replay requests is true, we need to replay
@@ -254,8 +250,6 @@ func (rrs *receivedRequestService) Process(message format.Message,
 	}
 
 	// auto-confirm if we should
-	authState.partnerCallbacks.RLock()
-	defer authState.partnerCallbacks.RUnlock()
 	if autoConfirm || reset {
 		_, _ = authState.confirm(c, authState.params.getConfirmTag(reset))
 		//handle callbacks
diff --git a/auth/state.go b/auth/state.go
index 43e1d9735..fda5ba2c9 100644
--- a/auth/state.go
+++ b/auth/state.go
@@ -115,13 +115,11 @@ func (s *state) CallAllReceivedRequests() {
 		rr := rrList[i]
 		eph := receptionID.BuildIdentityFromRound(rr.GetContact().ID,
 			rr.GetRound())
-		s.partnerCallbacks.RLock()
 		if cb := s.partnerCallbacks.getPartnerCallback(rr.GetContact().ID); cb != nil {
 			cb.Request(rr.GetContact(), eph, rr.GetRound())
 		} else {
 			s.callbacks.Request(rr.GetContact(), eph, rr.GetRound())
 		}
-		s.partnerCallbacks.RUnlock()
 	}
 }
 
-- 
GitLab