github.com/ava-labs/avalanchego@v1.11.11/network/peer/msg_length.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package peer 5 6 import ( 7 "encoding/binary" 8 "errors" 9 "fmt" 10 11 "github.com/ava-labs/avalanchego/utils/wrappers" 12 ) 13 14 var ( 15 errInvalidMessageLength = errors.New("invalid message length") 16 errMaxMessageLengthExceeded = errors.New("maximum message length exceeded") 17 ) 18 19 func writeMsgLen(msgLen uint32, maxMsgLen uint32) ([wrappers.IntLen]byte, error) { 20 if msgLen > maxMsgLen { 21 return [wrappers.IntLen]byte{}, fmt.Errorf( 22 "%w; the message length %d exceeds the specified limit %d", 23 errMaxMessageLengthExceeded, 24 msgLen, 25 maxMsgLen, 26 ) 27 } 28 29 b := [wrappers.IntLen]byte{} 30 binary.BigEndian.PutUint32(b[:], msgLen) 31 32 return b, nil 33 } 34 35 func readMsgLen(b []byte, maxMsgLen uint32) (uint32, error) { 36 if len(b) != wrappers.IntLen { 37 return 0, fmt.Errorf( 38 "%w; readMsgLen only supports 4 bytes (got %d bytes)", 39 errInvalidMessageLength, 40 len(b), 41 ) 42 } 43 44 // parse the message length 45 msgLen := binary.BigEndian.Uint32(b) 46 if msgLen > maxMsgLen { 47 return 0, fmt.Errorf( 48 "%w; the message length %d exceeds the specified limit %d", 49 errMaxMessageLengthExceeded, 50 msgLen, 51 maxMsgLen, 52 ) 53 } 54 55 return msgLen, nil 56 }