Internal change
PiperOrigin-RevId: 448332185
diff --git a/quiche/quic/core/crypto/quic_crypto_server_config.cc b/quiche/quic/core/crypto/quic_crypto_server_config.cc
index 11ccc2f..7a651bf 100644
--- a/quiche/quic/core/crypto/quic_crypto_server_config.cc
+++ b/quiche/quic/core/crypto/quic_crypto_server_config.cc
@@ -706,7 +706,7 @@
params,
quiche::QuicheReferenceCountedPointer<QuicSignedServerConfig> signed_config,
QuicByteCount total_framing_overhead, QuicByteCount chlo_packet_size,
- std::unique_ptr<ProcessClientHelloResultCallback> done_cb) const {
+ std::shared_ptr<ProcessClientHelloResultCallback> done_cb) const {
QUICHE_DCHECK(done_cb);
auto context = std::make_unique<ProcessClientHelloContext>(
validate_chlo_result, reject_only, connection_id, server_address,
diff --git a/quiche/quic/core/crypto/quic_crypto_server_config.h b/quiche/quic/core/crypto/quic_crypto_server_config.h
index c3febdc..f114546 100644
--- a/quiche/quic/core/crypto/quic_crypto_server_config.h
+++ b/quiche/quic/core/crypto/quic_crypto_server_config.h
@@ -335,7 +335,7 @@
quiche::QuicheReferenceCountedPointer<QuicSignedServerConfig>
signed_config,
QuicByteCount total_framing_overhead, QuicByteCount chlo_packet_size,
- std::unique_ptr<ProcessClientHelloResultCallback> done_cb) const;
+ std::shared_ptr<ProcessClientHelloResultCallback> done_cb) const;
// BuildServerConfigUpdateMessage invokes |cb| with a SCUP message containing
// the current primary config, an up to date source-address token, and cert
@@ -587,7 +587,7 @@
quiche::QuicheReferenceCountedPointer<QuicSignedServerConfig>
signed_config,
QuicByteCount total_framing_overhead, QuicByteCount chlo_packet_size,
- std::unique_ptr<ProcessClientHelloResultCallback> done_cb)
+ std::shared_ptr<ProcessClientHelloResultCallback> done_cb)
: validate_chlo_result_(validate_chlo_result),
reject_only_(reject_only),
connection_id_(connection_id),
@@ -674,7 +674,7 @@
signed_config_;
const QuicByteCount total_framing_overhead_;
const QuicByteCount chlo_packet_size_;
- std::unique_ptr<ProcessClientHelloResultCallback> done_cb_;
+ std::shared_ptr<ProcessClientHelloResultCallback> done_cb_;
};
// Callback class for bridging between ProcessClientHello and
diff --git a/quiche/quic/core/quic_crypto_server_stream.cc b/quiche/quic/core/quic_crypto_server_stream.cc
index 5d41e47..2bd8fbd 100644
--- a/quiche/quic/core/quic_crypto_server_stream.cc
+++ b/quiche/quic/core/quic_crypto_server_stream.cc
@@ -69,7 +69,6 @@
zero_rtt_attempted_(false),
chlo_packet_size_(0),
validate_client_hello_cb_(nullptr),
- process_client_hello_cb_(nullptr),
encryption_established_(false),
one_rtt_keys_available_(false),
one_rtt_packet_decrypted_(false),
@@ -89,9 +88,10 @@
send_server_config_update_cb_->Cancel();
send_server_config_update_cb_ = nullptr;
}
- if (process_client_hello_cb_ != nullptr) {
- process_client_hello_cb_->Cancel();
- process_client_hello_cb_ = nullptr;
+ if (std::shared_ptr<ProcessClientHelloCallback> cb =
+ process_client_hello_cb_.lock()) {
+ cb->Cancel();
+ process_client_hello_cb_.reset();
}
}
@@ -115,7 +115,7 @@
}
if (validate_client_hello_cb_ != nullptr ||
- process_client_hello_cb_ != nullptr) {
+ !process_client_hello_cb_.expired()) {
// Already processing some other handshake message. The protocol
// does not allow for clients to send multiple handshake messages
// before the server has a chance to respond.
@@ -129,7 +129,7 @@
std::unique_ptr<ValidateCallback> cb(new ValidateCallback(this));
QUICHE_DCHECK(validate_client_hello_cb_ == nullptr);
- QUICHE_DCHECK(process_client_hello_cb_ == nullptr);
+ QUICHE_DCHECK(process_client_hello_cb_.expired());
validate_client_hello_cb_ = cb.get();
crypto_config_->ValidateClientHello(
message, GetClientAddress(), session()->connection()->self_address(),
@@ -144,12 +144,11 @@
std::unique_ptr<ProofSource::Details> details) {
// Clear the callback that got us here.
QUICHE_DCHECK(validate_client_hello_cb_ != nullptr);
- QUICHE_DCHECK(process_client_hello_cb_ == nullptr);
+ QUICHE_DCHECK(process_client_hello_cb_.expired());
validate_client_hello_cb_ = nullptr;
- std::unique_ptr<ProcessClientHelloCallback> cb(
- new ProcessClientHelloCallback(this, result));
- process_client_hello_cb_ = cb.get();
+ auto cb = std::make_shared<ProcessClientHelloCallback>(this, result);
+ process_client_hello_cb_ = cb;
ProcessClientHello(result, std::move(details), std::move(cb));
}
@@ -161,9 +160,9 @@
std::unique_ptr<DiversificationNonce> diversification_nonce,
std::unique_ptr<ProofSource::Details> proof_source_details) {
// Clear the callback that got us here.
- QUICHE_DCHECK(process_client_hello_cb_ != nullptr);
+ QUICHE_DCHECK(!process_client_hello_cb_.expired());
QUICHE_DCHECK(validate_client_hello_cb_ == nullptr);
- process_client_hello_cb_ = nullptr;
+ process_client_hello_cb_.reset();
proof_source_details_ = std::move(proof_source_details);
AdjustTestValue("quic::QuicCryptoServerStream::after_process_client_hello",
@@ -457,7 +456,7 @@
ValidateClientHelloResultCallback::Result>
result,
std::unique_ptr<ProofSource::Details> proof_source_details,
- std::unique_ptr<ProcessClientHelloResultCallback> done_cb) {
+ std::shared_ptr<ProcessClientHelloResultCallback> done_cb) {
proof_source_details_ = std::move(proof_source_details);
const CryptoHandshakeMessage& message = result->client_hello;
std::string error_details;
diff --git a/quiche/quic/core/quic_crypto_server_stream.h b/quiche/quic/core/quic_crypto_server_stream.h
index f91ceba..665d071 100644
--- a/quiche/quic/core/quic_crypto_server_stream.h
+++ b/quiche/quic/core/quic_crypto_server_stream.h
@@ -101,7 +101,7 @@
ValidateClientHelloResultCallback::Result>
result,
std::unique_ptr<ProofSource::Details> proof_source_details,
- std::unique_ptr<ProcessClientHelloResultCallback> done_cb);
+ std::shared_ptr<ProcessClientHelloResultCallback> done_cb);
// Hook that allows the server to set QuicConfig defaults just
// before going through the parameter negotiation step.
@@ -254,7 +254,7 @@
// ProcessClientHello and forward it to
// FinishProcessingHandshakeMessageAfterProcessClientHello. Note that this
// field is mutually exclusive with validate_client_hello_cb_.
- ProcessClientHelloCallback* process_client_hello_cb_;
+ std::weak_ptr<ProcessClientHelloCallback> process_client_hello_cb_;
// The ProofSource::Details from this connection.
std::unique_ptr<ProofSource::Details> proof_source_details_;