@@ -94,6 +94,8 @@ const (
94
94
// Should reject packets smaller than minPacketSize.
95
95
minPacketSize = 63
96
96
97
+ maxPacketSize = 1280
98
+
97
99
minMessageSize = 48 // this refers to data after static headers
98
100
randomPacketMsgSize = 20
99
101
)
@@ -122,6 +124,13 @@ var (
122
124
ErrInvalidReqID = errors .New ("request ID larger than 8 bytes" )
123
125
)
124
126
127
+ // IsInvalidHeader reports whether 'err' is related to an invalid packet header. When it
128
+ // returns false, it is pretty certain that the packet causing the error does not belong
129
+ // to discv5.
130
+ func IsInvalidHeader (err error ) bool {
131
+ return err == errTooShort || err == errInvalidHeader || err == errMsgTooShort
132
+ }
133
+
125
134
// Packet sizes.
126
135
var (
127
136
sizeofStaticHeader = binary .Size (StaticHeader {})
@@ -147,6 +156,7 @@ type Codec struct {
147
156
msgctbuf []byte // message data ciphertext
148
157
149
158
// decoder buffer
159
+ decbuf []byte
150
160
reader bytes.Reader
151
161
}
152
162
@@ -158,6 +168,7 @@ func NewCodec(ln *enode.LocalNode, key *ecdsa.PrivateKey, clock mclock.Clock, pr
158
168
privkey : key ,
159
169
sc : NewSessionCache (1024 , clock ),
160
170
protocolID : DefaultProtocolID ,
171
+ decbuf : make ([]byte , maxPacketSize ),
161
172
}
162
173
if protocolID != nil {
163
174
c .protocolID = * protocolID
@@ -424,10 +435,13 @@ func (c *Codec) encryptMessage(s *session, p Packet, head *Header, headerData []
424
435
}
425
436
426
437
// Decode decodes a discovery packet.
427
- func (c * Codec ) Decode (input []byte , addr string ) (src enode.ID , n * enode.Node , p Packet , err error ) {
428
- if len (input ) < minPacketSize {
438
+ func (c * Codec ) Decode (inputData []byte , addr string ) (src enode.ID , n * enode.Node , p Packet , err error ) {
439
+ if len (inputData ) < minPacketSize {
429
440
return enode.ID {}, nil , nil , errTooShort
430
441
}
442
+ // Copy the packet to a tmp buffer to avoid modifying it.
443
+ c .decbuf = append (c .decbuf [:0 ], inputData ... )
444
+ input := c .decbuf
431
445
// Unmask the static header.
432
446
var head Header
433
447
copy (head .IV [:], input [:sizeofMaskingIV ])
0 commit comments