Skip to content

Commit f6f8f6b

Browse files
author
AKRAM@il.ibm.com
committed
Fix: Ensure Done() is called on external wallets even on errors
Use defer to guarantee that Done() is called on all external wallet signers regardless of whether errors occur during signature collection, auditing, or approval phases. This prevents resource leaks when the endorsement process fails early. Previously, if requestSignaturesOnIssues or requestSignaturesOnTransfers returned an error, any external wallets already added to the map would not have their Done() method called, potentially leaving resources uncleaned.
1 parent c167f63 commit f6f8f6b

File tree

1 file changed

+11
-9
lines changed

1 file changed

+11
-9
lines changed

token/services/ttx/collectendorsements.go

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,17 @@ func (c *CollectEndorsementsView) Call(context view.Context) (interface{}, error
8484
metrics := GetMetrics(context)
8585

8686
externalWallets := make(map[string]ExternalWalletSigner)
87+
88+
// Ensure Done() is called on all external wallets regardless of errors
89+
defer func() {
90+
logger.DebugfContext(context.Context(), "Inform external wallets that endorsement is complete")
91+
for id, signer := range externalWallets {
92+
if err := signer.Done(); err != nil {
93+
logger.ErrorfContext(context.Context(), "failed to signal done external wallet [%s]", id)
94+
}
95+
}
96+
}()
97+
8798
// 1. First collect signatures on the token request
8899
issueSigmas, err := c.requestSignaturesOnIssues(context, externalWallets)
89100
if err != nil {
@@ -95,15 +106,6 @@ func (c *CollectEndorsementsView) Call(context view.Context) (interface{}, error
95106
return nil, errors.WithMessagef(err, "failed requesting signatures on transfers")
96107
}
97108

98-
// signal the external wallets that the process is completed
99-
logger.DebugfContext(context.Context(), "Inform external wallets that endorsement is complete")
100-
for id, signer := range externalWallets {
101-
if err := signer.Done(); err != nil {
102-
logger.ErrorfContext(context.Context(), "failed to signal done external wallet [%s]", id)
103-
logger.Errorf("failed to signal done external wallet [%s]", id)
104-
}
105-
}
106-
107109
// Add the signatures to the token request
108110
logger.DebugfContext(context.Context(), "Add the signatures to the token request")
109111
if !c.tx.TokenRequest.SetSignatures(mergeSigmas(issueSigmas, transferSigmas)) {

0 commit comments

Comments
 (0)