Skip to content

Commit b63fae3

Browse files
[NONEVM-3303] [COT-01] Nil Pointer Dereference In Trace Tracking Causes Client Crash (#478)
* fix: receivedMessage could be nil if channel closed * fix: lint * fix: handle context
1 parent 9f83d68 commit b63fae3

File tree

1 file changed

+24
-9
lines changed

1 file changed

+24
-9
lines changed

pkg/ton/tracetracking/message.go

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package tracetracking
22

33
import (
44
"context"
5+
"errors"
56
"fmt"
67
"math/big"
78

@@ -342,23 +343,37 @@ func (m *ReceivedMessage) WaitForOutgoingMessagesToBeReceived(ctx context.Contex
342343
transactionsReceived := make(chan *tlb.Transaction)
343344
go c.SubscribeOnTransactions(ctx, sentMessage.InternalMsg.DstAddr, m.LamportTime, transactionsReceived)
344345

345-
var receivedMessage *ReceivedMessage
346-
for rTX := range transactionsReceived {
346+
receivedMessage, err := waitForMatchingMessage(ctx, transactionsReceived, sentMessage)
347+
if err != nil {
348+
return err
349+
}
350+
m.OutgoingInternalReceivedMessages = append(m.OutgoingInternalReceivedMessages, receivedMessage)
351+
}
352+
353+
return nil
354+
}
355+
356+
func waitForMatchingMessage(ctx context.Context, transactionsReceived chan *tlb.Transaction, sentMessage *SentMessage) (*ReceivedMessage, error) {
357+
for {
358+
select {
359+
case <-ctx.Done():
360+
return nil, ctx.Err()
361+
case rTX, ok := <-transactionsReceived:
362+
if !ok {
363+
return nil, errors.New("transaction channel closed")
364+
}
365+
347366
if rTX.IO.In != nil && rTX.IO.In.MsgType == tlb.MsgTypeInternal {
348-
var err error
349-
receivedMessage, err = sentMessage.MapToReceivedMessageIfMatches(rTX)
367+
receivedMessage, err := sentMessage.MapToReceivedMessageIfMatches(rTX)
350368
if err != nil {
351-
return fmt.Errorf("failed to process incoming message: %w", err)
369+
return nil, fmt.Errorf("failed to process incoming message: %w", err)
352370
}
353371
if receivedMessage != nil {
354-
break
372+
return receivedMessage, nil
355373
}
356374
}
357375
}
358-
m.OutgoingInternalReceivedMessages = append(m.OutgoingInternalReceivedMessages, receivedMessage)
359376
}
360-
361-
return nil
362377
}
363378

364379
// MapToReceivedMessageIfMatches checks if a transaction corresponds to the reception

0 commit comments

Comments
 (0)