Copy cached transport parameters and application states instead of using pointers in QUIC 0-RTT setup. There is currently a time gap between looking up the cache and using the cache. During this gap, the cache could be invalidated. Client side change. not protected. PiperOrigin-RevId: 327337399 Change-Id: I04bc99d8cf77b613f635e1da91d75c8269cf9e95
diff --git a/quic/core/crypto/quic_crypto_client_config.h b/quic/core/crypto/quic_crypto_client_config.h index 3d90757..701b7ff 100644 --- a/quic/core/crypto/quic_crypto_client_config.h +++ b/quic/core/crypto/quic_crypto_client_config.h
@@ -42,13 +42,13 @@ // client didn't receive a 0-RTT capable session ticket from the server, // |transport_params| will be null. Otherwise, it will contain the transport // parameters received from the server on the original connection. - TransportParameters* transport_params; + std::unique_ptr<TransportParameters> transport_params = nullptr; // If |transport_params| is null, then |application_state| is ignored and // should be empty. |application_state| contains serialized state that the // client received from the server at the application layer that the client // needs to remember when performing a 0-RTT handshake. - ApplicationState* application_state; + std::unique_ptr<ApplicationState> application_state = nullptr; }; // SessionCache is an interface for managing storing and retrieving
diff --git a/quic/core/tls_client_handshaker.cc b/quic/core/tls_client_handshaker.cc index 265496d..dfaab51 100644 --- a/quic/core/tls_client_handshaker.cc +++ b/quic/core/tls_client_handshaker.cc
@@ -130,7 +130,8 @@ bool TlsClientHandshaker::PrepareZeroRttConfig( QuicResumptionState* cached_state) { std::string error_details; - if (handshaker_delegate()->ProcessTransportParameters( + if (!cached_state->transport_params || + handshaker_delegate()->ProcessTransportParameters( *(cached_state->transport_params), /*is_resumption = */ true, &error_details) != QUIC_NO_ERROR) { QUIC_BUG << "Unable to parse cached transport parameters."; @@ -144,7 +145,9 @@ session()->OnConfigNegotiated(); if (has_application_state_) { - if (!session()->ResumeApplicationState(cached_state->application_state)) { + if (!cached_state->application_state || + !session()->ResumeApplicationState( + cached_state->application_state.get())) { QUIC_BUG << "Unable to parse cached application state."; CloseConnection(QUIC_HANDSHAKE_FAILED, "Client failed to parse cached application state.");
diff --git a/quic/test_tools/simple_session_cache.cc b/quic/test_tools/simple_session_cache.cc index 94b8764..9f851b9 100644 --- a/quic/test_tools/simple_session_cache.cc +++ b/quic/test_tools/simple_session_cache.cc
@@ -42,8 +42,12 @@ auto state = std::make_unique<QuicResumptionState>(); state->tls_session = std::move(it->second.session); - state->application_state = it->second.application_state.get(); - state->transport_params = it->second.params.get(); + if (it->second.application_state != nullptr) { + state->application_state = + std::make_unique<ApplicationState>(*it->second.application_state); + } + state->transport_params = + std::make_unique<TransportParameters>(*it->second.params); return state; }