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
commit 49f8be8763e60c2ee4c13c5d10956e2059cc712c Author: Masaori Koshiba <[email protected]> AuthorDate: Wed Aug 22 16:02:20 2018 +0900 Check frame size when AckFrameCreator/AltConnectionManager/PathValidator generate frame --- iocore/net/quic/QUICAckFrameCreator.cc | 13 +++++++++---- iocore/net/quic/QUICAltConnectionManager.cc | 10 ++++++++-- iocore/net/quic/QUICPathValidator.cc | 19 +++++++++++++++---- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/iocore/net/quic/QUICAckFrameCreator.cc b/iocore/net/quic/QUICAckFrameCreator.cc index cdfda94..239aff0 100644 --- a/iocore/net/quic/QUICAckFrameCreator.cc +++ b/iocore/net/quic/QUICAckFrameCreator.cc @@ -64,10 +64,15 @@ QUICAckFrameCreator::generate_frame(QUICEncryptionLevel level, uint64_t connecti if (this->_can_send[index]) { QUICAckPacketNumbers *packet_numbers = &this->_packet_numbers[index]; - ack_frame = this->_create_ack_frame(level); - this->_can_send[index] = false; - this->_should_send[index] = false; - packet_numbers->clear(); + ack_frame = this->_create_ack_frame(level); + if (ack_frame && ack_frame->size() > maximum_frame_size) { + // Cancel generating frame + ack_frame = QUICFrameFactory::create_null_frame(); + } else { + this->_can_send[index] = false; + this->_should_send[index] = false; + packet_numbers->clear(); + } } return ack_frame; diff --git a/iocore/net/quic/QUICAltConnectionManager.cc b/iocore/net/quic/QUICAltConnectionManager.cc index 4ad73f7..feb1aa8 100644 --- a/iocore/net/quic/QUICAltConnectionManager.cc +++ b/iocore/net/quic/QUICAltConnectionManager.cc @@ -116,9 +116,15 @@ QUICAltConnectionManager::generate_frame(QUICEncryptionLevel level, uint64_t con int count = this->_nids; for (int i = 0; i < count; ++i) { if (!this->_alt_quic_connection_ids[i].advertised) { - this->_alt_quic_connection_ids[i].advertised = true; - return QUICFrameFactory::create_new_connection_id_frame( + frame = QUICFrameFactory::create_new_connection_id_frame( this->_alt_quic_connection_ids[i].seq_num, this->_alt_quic_connection_ids[i].id, this->_alt_quic_connection_ids[i].token); + + if (frame && frame->size() > maximum_frame_size) { + // Cancel generating frame + frame = QUICFrameFactory::create_null_frame(); + } else { + this->_alt_quic_connection_ids[i].advertised = true; + } } } this->_need_advertise = false; diff --git a/iocore/net/quic/QUICPathValidator.cc b/iocore/net/quic/QUICPathValidator.cc index 53db58d..bdc6cc6 100644 --- a/iocore/net/quic/QUICPathValidator.cc +++ b/iocore/net/quic/QUICPathValidator.cc @@ -126,13 +126,24 @@ QUICPathValidator::generate_frame(QUICEncryptionLevel level, uint64_t connection } if (this->_has_outgoing_response) { - frame = QUICFrameFactory::create_path_response_frame(this->_incoming_challenge); - this->_has_outgoing_response = false; + frame = QUICFrameFactory::create_path_response_frame(this->_incoming_challenge); + if (frame && frame->size() > maximum_quic_packet_size) { + // Cancel generating frame + frame = QUICFrameFactory::create_null_frame(); + } else { + this->_has_outgoing_response = false; + } } else if (this->_has_outgoing_challenge) { frame = QUICFrameFactory::create_path_challenge_frame(this->_outgoing_challenge + (QUICPathChallengeFrame::DATA_LEN * (this->_has_outgoing_challenge - 1))); - --this->_has_outgoing_challenge; - ink_assert(this->_has_outgoing_challenge >= 0); + if (frame && frame->size() > maximum_quic_packet_size) { + // Cancel generating frame + frame = QUICFrameFactory::create_null_frame(); + } else { + --this->_has_outgoing_challenge; + ink_assert(this->_has_outgoing_challenge >= 0); + } } + return frame; }
