[ 
https://issues.apache.org/jira/browse/THRIFT-6141?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Dmytro Shteflyuk resolved THRIFT-6141.
--------------------------------------
    Fix Version/s: 0.25.0
       Resolution: Fixed

> Ruby HeaderTransport exposes raw ZLIB decompression errors
> ----------------------------------------------------------
>
>                 Key: THRIFT-6141
>                 URL: https://issues.apache.org/jira/browse/THRIFT-6141
>             Project: Thrift
>          Issue Type: Bug
>          Components: Ruby - Library
>            Reporter: Dmytro Shteflyuk
>            Assignee: Dmytro Shteflyuk
>            Priority: Major
>             Fix For: 0.25.0
>
>          Time Spent: 50m
>  Remaining Estimate: 0h
>
> h3. Problem
> Ruby HeaderTransport applies the ZLIB transform without adapting 
> Zlib::DataError and Zlib::BufError to the established Thrift transport 
> exception boundary. Invalid or truncated compressed frame payloads therefore 
> expose implementation-specific exceptions to callers.
> h3. Client impact
> Applications that handle malformed transport input through 
> Thrift::TransportException can instead receive an unexpected Zlib exception. 
> Valid compressed frames and configured decompressed-size limits are 
> unaffected.
> h3. Reproduction
> Testing on master commit {{a9663bc6661a5dd1d99d629e1f269c1907592a1a}} 
> produces:
> {code:ruby}
> require "thrift"
> require "zlib"
> def header_frame(payload)
>   header = [
>     Thrift::HeaderSubprotocolID::BINARY,
>     1,
>     Thrift::HeaderTransformID::ZLIB,
>     0
>   ].pack("C*")
>   frame_size = 10 + header.bytesize + payload.bytesize
>   [
>     frame_size,
>     Thrift::HeaderTransport::HEADER_MAGIC,
>     0,
>     0,
>     header.bytesize / 4
>   ].pack("NnnNn") + header + payload
> end
> {
>   "invalid" => "not-zlib",
>   "truncated" => Zlib::Deflate.deflate("valid payload")[0...-1]
> }.each do |name, payload|
>   transport = Thrift::HeaderTransport.new(
>     Thrift::MemoryBufferTransport.new(header_frame(payload))
>   )
>   begin
>     transport.read(1)
>   rescue => error
>     puts "#{name}: #{error.class}: #{error.message}"
>   end
> end
> {code}
> {noformat}
> invalid: Zlib::DataError: incorrect header check
> truncated: Zlib::BufError: buffer error
> {noformat}
> h3. Expected behavior
> Invalid and truncated ZLIB payloads should raise Thrift::TransportException 
> through the HeaderTransport boundary. Valid compressed frames should continue 
> to decompress, and oversized decompressed output should continue to raise 
> TransportException::SIZE_LIMIT.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to