@@ -870,13 +870,19 @@ func decompress(compressor encoding.Compressor, d mem.BufferSlice, dc Decompress
870870 return nil , status .Errorf (codes .Internal , "grpc: failed to decompress the message: %v" , err )
871871 }
872872
873- out , err := mem .ReadAll (io .LimitReader (dcReader , int64 (maxReceiveMessageSize )), pool )
873+ // Read at most one byte more than the limit from the decompressor.
874+ // Unless the limit is MaxInt64, in which case, that's impossible, so
875+ // apply no limit.
876+ if limit := int64 (maxReceiveMessageSize ); limit < math .MaxInt64 {
877+ dcReader = io .LimitReader (dcReader , limit + 1 )
878+ }
879+ out , err := mem .ReadAll (dcReader , pool )
874880 if err != nil {
875881 out .Free ()
876882 return nil , status .Errorf (codes .Internal , "grpc: failed to read decompressed data: %v" , err )
877883 }
878884
879- if out .Len () == maxReceiveMessageSize && ! atEOF ( dcReader ) {
885+ if out .Len () > maxReceiveMessageSize {
880886 out .Free ()
881887 return nil , status .Errorf (codes .ResourceExhausted , "grpc: received message after decompression larger than max %d" , maxReceiveMessageSize )
882888 }
@@ -885,12 +891,6 @@ func decompress(compressor encoding.Compressor, d mem.BufferSlice, dc Decompress
885891 return nil , status .Errorf (codes .Internal , "grpc: no decompressor available for compressed payload" )
886892}
887893
888- // atEOF reads data from r and returns true if zero bytes could be read and r.Read returns EOF.
889- func atEOF (dcReader io.Reader ) bool {
890- n , err := dcReader .Read (make ([]byte , 1 ))
891- return n == 0 && err == io .EOF
892- }
893-
894894type recvCompressor interface {
895895 RecvCompress () string
896896}
0 commit comments