From add29cf2d0a63ba047d67329e3a681033c907321 Mon Sep 17 00:00:00 2001 From: Slyghtning Date: Wed, 20 May 2026 21:48:08 +0200 Subject: [PATCH] instantout: guard MuSig peer slice lengths Peer MuSig data was indexed by reservation position before validating counts. Short server responses could panic loopd instead of returning an error. --- instantout/instantout.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/instantout/instantout.go b/instantout/instantout.go index f8c89eb0..d9405ffa 100644 --- a/instantout/instantout.go +++ b/instantout/instantout.go @@ -263,6 +263,12 @@ func (i *InstantOut) signMusig2Tx(ctx context.Context, if err != nil { return nil, err } + if len(musig2sessions) != len(inputs) { + return nil, fmt.Errorf("invalid number of MuSig2 sessions") + } + if len(counterPartyNonces) != len(inputs) { + return nil, fmt.Errorf("invalid number of peer nonces") + } prevOutFetcher := inputs.GetPrevoutFetcher() sigHashes := txscript.NewTxSigHashes(tx, prevOutFetcher) @@ -329,6 +335,12 @@ func (i *InstantOut) finalizeMusig2Transaction(ctx context.Context, if err != nil { return nil, err } + if len(musig2Sessions) != len(inputs) { + return nil, fmt.Errorf("invalid number of MuSig2 sessions") + } + if len(serverSigs) != len(inputs) { + return nil, fmt.Errorf("invalid number of peer signatures") + } for idx := range inputs { haveAllSigs, finalSig, err := signer.MuSig2CombineSig(