@@ -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,7 +190,7 @@ 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
@@ -240,7 +256,7 @@ func (f *Framer) readSynStreamFrame(h ControlFrameHeader, frame *SynStreamFrame)
240256 }
241257 reader = f .headerDecompressor
242258 }
243- frame .Headers , err = parseHeaderValueBlock (reader , frame .StreamId )
259+ frame .Headers , err = f . parseHeaderValueBlock (reader , frame .StreamId )
244260 if ! f .headerCompressionDisabled && (err == io .EOF && f .headerReader .N == 0 || f .headerReader .N != 0 ) {
245261 err = & Error {WrongCompressedPayloadSize , 0 }
246262 }
@@ -272,7 +288,7 @@ func (f *Framer) readSynReplyFrame(h ControlFrameHeader, frame *SynReplyFrame) e
272288 }
273289 reader = f .headerDecompressor
274290 }
275- frame .Headers , err = parseHeaderValueBlock (reader , frame .StreamId )
291+ frame .Headers , err = f . parseHeaderValueBlock (reader , frame .StreamId )
276292 if ! f .headerCompressionDisabled && (err == io .EOF && f .headerReader .N == 0 || f .headerReader .N != 0 ) {
277293 err = & Error {WrongCompressedPayloadSize , 0 }
278294 }
@@ -304,7 +320,7 @@ func (f *Framer) readHeadersFrame(h ControlFrameHeader, frame *HeadersFrame) err
304320 }
305321 reader = f .headerDecompressor
306322 }
307- frame .Headers , err = parseHeaderValueBlock (reader , frame .StreamId )
323+ frame .Headers , err = f . parseHeaderValueBlock (reader , frame .StreamId )
308324 if ! f .headerCompressionDisabled && (err == io .EOF && f .headerReader .N == 0 || f .headerReader .N != 0 ) {
309325 err = & Error {WrongCompressedPayloadSize , 0 }
310326 }
0 commit comments