@ -47,8 +47,8 @@ const uint8_t kZeros[64] = {};
namespace {
const NoDestruct < Slice > kZeroSlice { [ ] {
// Frame header size is fixed to 24 bytes.
auto slice = GRPC_SLICE_MALLOC ( FrameHeader : : frame_header_size_ ) ;
memset ( GRPC_SLICE_START_PTR ( slice ) , 0 , FrameHeader : : frame_header_size_ ) ;
auto slice = GRPC_SLICE_MALLOC ( FrameHeader : : kFrameHeaderSize ) ;
memset ( GRPC_SLICE_START_PTR ( slice ) , 0 , FrameHeader : : kFrameHeaderSize ) ;
return slice ;
} ( ) } ;
@ -81,7 +81,7 @@ class FrameSerializer {
SliceBuffer & AddTrailers ( ) {
header_ . flags . set ( 2 ) ;
header_ . header_length =
output_ . control . Length ( ) - FrameHeader : : frame_header_size_ ;
output_ . control . Length ( ) - FrameHeader : : kFrameHeaderSize ;
return output_ . control ;
}
@ -91,13 +91,13 @@ class FrameSerializer {
// Header length is already known in AddTrailers().
header_ . trailer_length = output_ . control . Length ( ) -
header_ . header_length -
FrameHeader : : frame_header_size_ ;
FrameHeader : : kFrameHeaderSize ;
} else {
if ( header_ . flags . is_set ( 0 ) ) {
// Calculate frame header length in Finish() since AddTrailers() isn't
// called.
header_ . header_length =
output_ . control . Length ( ) - FrameHeader : : frame_header_size_ ;
output_ . control . Length ( ) - FrameHeader : : kFrameHeaderSize ;
}
}
header_ . Serialize (
@ -175,9 +175,23 @@ absl::StatusOr<Arena::PoolPtr<Metadata>> ReadMetadata(
}
} // namespace
absl : : Status FrameLimits : : ValidateMessage ( const FrameHeader & header ) {
if ( header . message_length > max_message_size ) {
return absl : : InvalidArgumentError (
absl : : StrCat ( " Message length " , header . message_length ,
" exceeds maximum allowed " , max_message_size ) ) ;
}
if ( header . message_padding > max_padding ) {
return absl : : InvalidArgumentError (
absl : : StrCat ( " Message padding " , header . message_padding ,
" exceeds maximum allowed " , max_padding ) ) ;
}
return absl : : OkStatus ( ) ;
}
absl : : Status SettingsFrame : : Deserialize ( HPackParser * , const FrameHeader & header ,
absl : : BitGenRef , Arena * ,
BufferPair buffers ) {
BufferPair buffers , FrameLimits ) {
if ( header . type ! = FrameType : : kSettings ) {
return absl : : InvalidArgumentError ( " Expected settings frame " ) ;
}
@ -201,8 +215,8 @@ std::string SettingsFrame::ToString() const { return "SettingsFrame{}"; }
absl : : Status ClientFragmentFrame : : Deserialize ( HPackParser * parser ,
const FrameHeader & header ,
absl : : BitGenRef bitsrc ,
Arena * arena ,
BufferPair buffer s) {
Arena * arena , BufferPair buffers ,
FrameLimits limit s) {
if ( header . stream_id = = 0 ) {
return absl : : InvalidArgumentError ( " Expected non-zero stream id " ) ;
}
@ -224,6 +238,8 @@ absl::Status ClientFragmentFrame::Deserialize(HPackParser* parser,
" Unexpected non-zero header length " , header . header_length ) ) ;
}
if ( header . flags . is_set ( 1 ) ) {
auto r = limits . ValidateMessage ( header ) ;
if ( ! r . ok ( ) ) return r ;
message =
FragmentMessage { Arena : : MakePooled < Message > ( std : : move ( buffers . data ) , 0 ) ,
header . message_padding , header . message_length } ;
@ -279,8 +295,8 @@ std::string ClientFragmentFrame::ToString() const {
absl : : Status ServerFragmentFrame : : Deserialize ( HPackParser * parser ,
const FrameHeader & header ,
absl : : BitGenRef bitsrc ,
Arena * arena ,
BufferPair buffer s) {
Arena * arena , BufferPair buffers ,
FrameLimits limit s) {
if ( header . stream_id = = 0 ) {
return absl : : InvalidArgumentError ( " Expected non-zero stream id " ) ;
}
@ -299,6 +315,8 @@ absl::Status ServerFragmentFrame::Deserialize(HPackParser* parser,
" Unexpected non-zero header length " , header . header_length ) ) ;
}
if ( header . flags . is_set ( 1 ) ) {
auto r = limits . ValidateMessage ( header ) ;
if ( ! r . ok ( ) ) return r ;
message . emplace ( Arena : : MakePooled < Message > ( std : : move ( buffers . data ) , 0 ) ,
header . message_padding , header . message_length ) ;
} else if ( buffers . data . Length ( ) ! = 0 ) {
@ -347,7 +365,7 @@ std::string ServerFragmentFrame::ToString() const {
absl : : Status CancelFrame : : Deserialize ( HPackParser * , const FrameHeader & header ,
absl : : BitGenRef , Arena * ,
BufferPair buffers ) {
BufferPair buffers , FrameLimits ) {
if ( header . type ! = FrameType : : kCancel ) {
return absl : : InvalidArgumentError ( " Expected cancel frame " ) ;
}