@@ -43,6 +43,11 @@ func (frame *SettingsFrame) read(h ControlFrameHeader, f *Framer) error {
4343 if err := binary .Read (f .r , binary .BigEndian , & numSettings ); err != nil {
4444 return err
4545 }
46+ // Each setting is 8 bytes (4-byte id + 4-byte value).
47+ // Payload is 4 bytes for numSettings + numSettings*8.
48+ if h .length < 4 || numSettings > (h .length - 4 )/ 8 {
49+ return & Error {InvalidControlFrame , 0 }
50+ }
4651 frame .FlagIdValues = make ([]SettingsFlagIdValue , numSettings )
4752 for i := uint32 (0 ); i < numSettings ; i ++ {
4853 if err := binary .Read (f .r , binary .BigEndian , & frame .FlagIdValues [i ].Id ); err != nil {
@@ -161,8 +166,19 @@ func (f *Framer) parseControlFrame(version uint16, frameType ControlFrameType) (
161166 if err := binary .Read (f .r , binary .BigEndian , & length ); err != nil {
162167 return nil , err
163168 }
169+ maxControlFramePayload := uint32 (MaxDataLength )
170+ if f .maxFrameLength > 0 {
171+ maxControlFramePayload = f .maxFrameLength
172+ }
173+
164174 flags := ControlFlags ((length & 0xff000000 ) >> 24 )
165175 length &= 0xffffff
176+ if length > maxControlFramePayload {
177+ if _ , err := io .CopyN (io .Discard , f .r , int64 (length )); err != nil {
178+ return nil , err
179+ }
180+ return nil , & Error {InvalidControlFrame , 0 }
181+ }
166182 header := ControlFrameHeader {version , frameType , flags , length }
167183 cframe , err := newControlFrame (frameType )
168184 if err != nil {
@@ -174,18 +190,32 @@ func (f *Framer) parseControlFrame(version uint16, frameType ControlFrameType) (
174190 return cframe , nil
175191}
176192
177- func parseHeaderValueBlock (r io.Reader , streamId StreamId ) (http.Header , error ) {
193+ func ( f * Framer ) parseHeaderValueBlock (r io.Reader , streamId StreamId ) (http.Header , error ) {
178194 var numHeaders uint32
179195 if err := binary .Read (r , binary .BigEndian , & numHeaders ); err != nil {
180196 return nil , err
181197 }
198+ maxHeaders := defaultMaxHeaderCount
199+ if f .maxHeaderCount > 0 {
200+ maxHeaders = f .maxHeaderCount
201+ }
202+ if numHeaders > maxHeaders {
203+ return nil , & Error {InvalidControlFrame , streamId }
204+ }
205+ maxFieldSize := defaultMaxHeaderFieldSize
206+ if f .maxHeaderFieldSize > 0 {
207+ maxFieldSize = f .maxHeaderFieldSize
208+ }
182209 var e error
183210 h := make (http.Header , int (numHeaders ))
184211 for i := 0 ; i < int (numHeaders ); i ++ {
185212 var length uint32
186213 if err := binary .Read (r , binary .BigEndian , & length ); err != nil {
187214 return nil , err
188215 }
216+ if length > maxFieldSize {
217+ return nil , & Error {InvalidControlFrame , streamId }
218+ }
189219 nameBytes := make ([]byte , length )
190220 if _ , err := io .ReadFull (r , nameBytes ); err != nil {
191221 return nil , err
@@ -201,6 +231,9 @@ func parseHeaderValueBlock(r io.Reader, streamId StreamId) (http.Header, error)
201231 if err := binary .Read (r , binary .BigEndian , & length ); err != nil {
202232 return nil , err
203233 }
234+ if length > maxFieldSize {
235+ return nil , & Error {InvalidControlFrame , streamId }
236+ }
204237 value := make ([]byte , length )
205238 if _ , err := io .ReadFull (r , value ); err != nil {
206239 return nil , err
@@ -240,7 +273,7 @@ func (f *Framer) readSynStreamFrame(h ControlFrameHeader, frame *SynStreamFrame)
240273 }
241274 reader = f .headerDecompressor
242275 }
243- frame .Headers , err = parseHeaderValueBlock (reader , frame .StreamId )
276+ frame .Headers , err = f . parseHeaderValueBlock (reader , frame .StreamId )
244277 if ! f .headerCompressionDisabled && (err == io .EOF && f .headerReader .N == 0 || f .headerReader .N != 0 ) {
245278 err = & Error {WrongCompressedPayloadSize , 0 }
246279 }
@@ -272,7 +305,7 @@ func (f *Framer) readSynReplyFrame(h ControlFrameHeader, frame *SynReplyFrame) e
272305 }
273306 reader = f .headerDecompressor
274307 }
275- frame .Headers , err = parseHeaderValueBlock (reader , frame .StreamId )
308+ frame .Headers , err = f . parseHeaderValueBlock (reader , frame .StreamId )
276309 if ! f .headerCompressionDisabled && (err == io .EOF && f .headerReader .N == 0 || f .headerReader .N != 0 ) {
277310 err = & Error {WrongCompressedPayloadSize , 0 }
278311 }
@@ -304,7 +337,7 @@ func (f *Framer) readHeadersFrame(h ControlFrameHeader, frame *HeadersFrame) err
304337 }
305338 reader = f .headerDecompressor
306339 }
307- frame .Headers , err = parseHeaderValueBlock (reader , frame .StreamId )
340+ frame .Headers , err = f . parseHeaderValueBlock (reader , frame .StreamId )
308341 if ! f .headerCompressionDisabled && (err == io .EOF && f .headerReader .N == 0 || f .headerReader .N != 0 ) {
309342 err = & Error {WrongCompressedPayloadSize , 0 }
310343 }
0 commit comments