This is an automated email from the ASF dual-hosted git repository. masaori pushed a commit to branch quic-latest in repository https://gitbox.apache.org/repos/asf/trafficserver.git
The following commit(s) were added to refs/heads/quic-latest by this push: new 5a77a80 Fix stack-buffer-overflow on storing data frame 5a77a80 is described below commit 5a77a807942e8ef5eb4f0b844bcc881e0367375d Author: Masaori Koshiba <masaori...@gmail.com> AuthorDate: Wed May 1 14:31:44 2019 +0900 Fix stack-buffer-overflow on storing data frame --- proxy/http3/Http3DataFramer.cc | 19 ++++++++++++++----- proxy/http3/Http3Frame.h | 2 ++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/proxy/http3/Http3DataFramer.cc b/proxy/http3/Http3DataFramer.cc index 5f58e92..491210e 100644 --- a/proxy/http3/Http3DataFramer.cc +++ b/proxy/http3/Http3DataFramer.cc @@ -38,11 +38,20 @@ Http3DataFramer::generate_frame(uint16_t max_size) Http3FrameUPtr frame = Http3FrameFactory::create_null_frame(); IOBufferReader *reader = this->_source_vio->get_reader(); - size_t len = std::min(reader->read_avail(), static_cast<int64_t>(max_size)); - if (len) { - frame = Http3FrameFactory::create_data_frame(reinterpret_cast<uint8_t *>(reader->start()), len); - reader->consume(len); - this->_source_vio->ndone += len; + + if (max_size <= Http3Frame::MAX_FRAM_HEADER_OVERHEAD) { + return frame; + } + + size_t payload_len = max_size - Http3Frame::MAX_FRAM_HEADER_OVERHEAD; + if (!reader->is_read_avail_more_than(payload_len)) { + payload_len = reader->read_avail(); + } + + if (payload_len) { + frame = Http3FrameFactory::create_data_frame(reinterpret_cast<uint8_t *>(reader->start()), payload_len); + reader->consume(payload_len); + this->_source_vio->ndone += payload_len; } return frame; diff --git a/proxy/http3/Http3Frame.h b/proxy/http3/Http3Frame.h index be0b48e..48ead5f 100644 --- a/proxy/http3/Http3Frame.h +++ b/proxy/http3/Http3Frame.h @@ -32,6 +32,8 @@ class Http3Frame { public: + constexpr static size_t MAX_FRAM_HEADER_OVERHEAD = 128; ///< Type (i) + Length (i) + Http3Frame() {} Http3Frame(const uint8_t *buf, size_t len); Http3Frame(Http3FrameType type);