Change TlsServerHandshaker::server_params_ to std::unique_ptr<TransportParameters>. TlsServerHandshaker stored `TransportParameters server_params_` inline by value. It is a large struct (~920 bytes) retained for the entire connection lifetime. PiperOrigin-RevId: 995937751
diff --git a/quiche/quic/core/tls_server_handshaker.cc b/quiche/quic/core/tls_server_handshaker.cc index c9c1add..0232356 100644 --- a/quiche/quic/core/tls_server_handshaker.cc +++ b/quiche/quic/core/tls_server_handshaker.cc
@@ -226,7 +226,8 @@ pre_shared_key_(crypto_config->pre_shared_key()), crypto_negotiated_params_(new QuicCryptoNegotiatedParameters), tls_connection_(crypto_config->ssl_ctx(), this, session->GetSSLConfig()), - crypto_config_(crypto_config) { + crypto_config_(crypto_config), + server_params_(std::make_unique<TransportParameters>()) { QUIC_DVLOG(1) << "TlsServerHandshaker: client_cert_mode initial value: " << client_cert_mode(); @@ -559,24 +560,24 @@ SetTransportParametersResult result; QUICHE_DCHECK(!result.success); - server_params_.perspective = Perspective::IS_SERVER; - server_params_.version_information = + server_params_->perspective = Perspective::IS_SERVER; + server_params_->version_information = TransportParameters::VersionInformation(); - server_params_.version_information->chosen_version = + server_params_->version_information->chosen_version = CreateQuicVersionLabel(session()->version()); - server_params_.version_information->other_versions = + server_params_->version_information->other_versions = CreateQuicVersionLabelVector(session()->supported_versions()); - if (!handshaker_delegate()->FillTransportParameters(&server_params_)) { + if (!handshaker_delegate()->FillTransportParameters(server_params_.get())) { return result; } // Notify QuicConnectionDebugVisitor. - session()->connection()->OnTransportParametersSent(server_params_); + session()->connection()->OnTransportParametersSent(*server_params_); { // Ensure |server_params_bytes| is not accessed out of the scope. std::vector<uint8_t> server_params_bytes; - if (!SerializeTransportParameters(server_params_, &server_params_bytes) || + if (!SerializeTransportParameters(*server_params_, &server_params_bytes) || SSL_set_quic_transport_params(ssl(), server_params_bytes.data(), server_params_bytes.size()) != 1) { return result; @@ -587,7 +588,7 @@ if (application_state_) { std::vector<uint8_t> early_data_context; if (!SerializeTransportParametersForTicket( - server_params_, *application_state_, &early_data_context)) { + *server_params_, *application_state_, &early_data_context)) { QUIC_BUG(quic_bug_10341_4) << "Failed to serialize Transport Parameters for ticket."; result.early_data_context = std::vector<uint8_t>(); @@ -604,6 +605,10 @@ bool TlsServerHandshaker::TransportParametersMatch( absl::Span<const uint8_t> serialized_params) const { + if (server_params_ == nullptr) { + QUIC_BUG(quic_tls_server_params_is_null); + return false; + } TransportParameters params; std::string error_details; @@ -617,7 +622,7 @@ DegreaseTransportParameters(params); - return params == server_params_; + return params == *server_params_; } void TlsServerHandshaker::SetWriteSecret(
diff --git a/quiche/quic/core/tls_server_handshaker.h b/quiche/quic/core/tls_server_handshaker.h index f3bf04d..1740f46 100644 --- a/quiche/quic/core/tls_server_handshaker.h +++ b/quiche/quic/core/tls_server_handshaker.h
@@ -438,6 +438,7 @@ bool encryption_established_ = false; bool valid_alpn_received_ = false; bool can_disable_resumption_ = true; + bool cert_matched_sni_ = false; quiche::QuicheReferenceCountedPointer<QuicCryptoNegotiatedParameters> crypto_negotiated_params_; TlsServerConnection tls_connection_; @@ -446,8 +447,7 @@ mutable std::unique_ptr<CachedNetworkParameters> last_received_cached_network_params_; - bool cert_matched_sni_ = false; - TransportParameters server_params_; + std::unique_ptr<TransportParameters> server_params_; // Functor for performing ALPN. Unset if not using handshake hints. ALPNSelectFunc select_alpn_;