Skip to content

Commit e07aa4f

Browse files
committed
fix errors.As check on *voteCompressionError
1 parent 6675dc0 commit e07aa4f

File tree

3 files changed

+18
-11
lines changed

3 files changed

+18
-11
lines changed

network/msgCompressor.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ const voteCompressionAbortMessage byte = 0xFF
4343
// This error type signals that an abort message should be sent to the peer.
4444
type voteCompressionError struct{ err error }
4545

46-
func (e voteCompressionError) Error() string { return e.err.Error() }
47-
func (e voteCompressionError) Unwrap() error { return e.err }
46+
func (e *voteCompressionError) Error() string { return e.err.Error() }
47+
func (e *voteCompressionError) Unwrap() error { return e.err }
4848

4949
// zstdCompressMsg returns a concatenation of a tag and compressed data
5050
func zstdCompressMsg(tbytes []byte, d []byte) ([]byte, string) {

network/wsNetwork_test.go

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -697,17 +697,22 @@ func TestWebsocketVoteDynamicCompressionAbortMessage(t *testing.T) {
697697
require.True(t, peerBtoA.msgCodec.statefulVoteEncEnabled.Load(), "VP encoding not established on B->A")
698698
require.True(t, peerBtoA.msgCodec.statefulVoteDecEnabled.Load(), "VP decoding not established on B->A")
699699

700-
// Send VP abort message from A to B
701-
abortMsg := append([]byte(protocol.VotePackedTag), voteCompressionAbortMessage)
702-
sent := peerAtoB.writeNonBlock(context.Background(), abortMsg, true, crypto.Digest{}, time.Now())
703-
require.True(t, sent, "failed to send abort message")
700+
// Send a malformed VP message from B to A to trigger decoder failure and abort handshake.
701+
malformedVP := append([]byte(protocol.VotePackedTag), []byte{0x01, 0xFF, 0x42}...)
702+
sent := peerBtoA.writeNonBlock(context.Background(), malformedVP, true, crypto.Digest{}, time.Now())
703+
require.True(t, sent, "failed to enqueue malformed VP message")
704704

705-
// Wait for abort to be processed - verify B disabled its encoder (can't send VP to A anymore)
705+
// Decoder on A should disable itself after the malformed vote.
706+
require.Eventually(t, func() bool {
707+
return !peerAtoB.msgCodec.statefulVoteDecEnabled.Load()
708+
}, 2*time.Second, 50*time.Millisecond, "VP decoding not disabled on A->B after malformed VP")
709+
710+
// Encoder on B should see the abort and disable as well.
706711
require.Eventually(t, func() bool {
707712
return !peerBtoA.msgCodec.statefulVoteEncEnabled.Load()
708-
}, 2*time.Second, 50*time.Millisecond, "VP encoding not disabled on B->A after receiving abort message")
713+
}, 2*time.Second, 50*time.Millisecond, "VP encoding not disabled on B->A after decoder abort")
709714

710-
// Verify connection is still up after abort
715+
// Verify connection is still up after abort handshake.
711716
require.Equal(t, 1, len(netB.peers), "connection should still be alive after abort")
712717
require.Equal(t, 1, len(netA.peers), "connection should still be alive after abort")
713718
}

network/wsPeer.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -585,7 +585,8 @@ func (wp *wsPeer) readLoop() {
585585
msg.Data, err = wp.msgCodec.decompress(msg.Tag, msg.Data)
586586
if err != nil {
587587
// Handle VP errors by sending abort message and continuing
588-
if errors.As(err, &voteCompressionError{}) {
588+
var vcErr *voteCompressionError
589+
if errors.As(err, &vcErr) {
589590
if close, reason := wp.handleVPError(err); close {
590591
cleanupCloseError = reason
591592
return
@@ -831,7 +832,8 @@ func (wp *wsPeer) writeLoopSendMsg(msg sendMessage) disconnectReason {
831832
compressed, err := wp.msgCodec.compress(tag, msg.data)
832833
if err != nil {
833834
// VP compression error - send abort message then continue with original AV
834-
if errors.As(err, &voteCompressionError{}) {
835+
var vcErr *voteCompressionError
836+
if errors.As(err, &vcErr) {
835837
networkVPAbortMessagesSent.Inc(nil)
836838
abortMsg := append([]byte(protocol.VotePackedTag), voteCompressionAbortMessage)
837839
_ = wp.conn.WriteMessage(websocket.BinaryMessage, abortMsg)

0 commit comments

Comments
 (0)