Use more scopers. Change-Id: I34dd0a57efd5435fcdc59a3c7b1ce806bc0cbb3e Reviewed-on: https://boringssl-review.googlesource.com/21946 Reviewed-by: Steven Valdez <svaldez@google.com> Commit-Queue: David Benjamin <davidben@google.com> CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
diff --git a/ssl/dtls_method.cc b/ssl/dtls_method.cc index fab19be..c64c75e 100644 --- a/ssl/dtls_method.cc +++ b/ssl/dtls_method.cc
@@ -94,8 +94,7 @@ OPENSSL_memset(&ssl->d1->bitmap, 0, sizeof(ssl->d1->bitmap)); OPENSSL_memset(ssl->s3->read_sequence, 0, sizeof(ssl->s3->read_sequence)); - Delete(ssl->s3->aead_read_ctx); - ssl->s3->aead_read_ctx = aead_ctx.release(); + ssl->s3->aead_read_ctx = std::move(aead_ctx); return true; } @@ -107,8 +106,8 @@ OPENSSL_memset(ssl->s3->write_sequence, 0, sizeof(ssl->s3->write_sequence)); Delete(ssl->d1->last_aead_write_ctx); - ssl->d1->last_aead_write_ctx = ssl->s3->aead_write_ctx; - ssl->s3->aead_write_ctx = aead_ctx.release(); + ssl->d1->last_aead_write_ctx = ssl->s3->aead_write_ctx.release(); + ssl->s3->aead_write_ctx = std::move(aead_ctx); return true; }
diff --git a/ssl/dtls_record.cc b/ssl/dtls_record.cc index a746640..3a5e50f 100644 --- a/ssl/dtls_record.cc +++ b/ssl/dtls_record.cc
@@ -278,7 +278,7 @@ return ssl->d1->last_aead_write_ctx; } - return ssl->s3->aead_write_ctx; + return ssl->s3->aead_write_ctx.get(); } size_t dtls_max_seal_overhead(const SSL *ssl, @@ -303,7 +303,7 @@ // Determine the parameters for the current epoch. uint16_t epoch = ssl->d1->w_epoch; - SSLAEADContext *aead = ssl->s3->aead_write_ctx; + SSLAEADContext *aead = ssl->s3->aead_write_ctx.get(); uint8_t *seq = ssl->s3->write_sequence; if (use_epoch == dtls1_use_previous_epoch) { assert(ssl->d1->w_epoch >= 1);
diff --git a/ssl/handshake.cc b/ssl/handshake.cc index 3cb9a9c..df47ed1 100644 --- a/ssl/handshake.cc +++ b/ssl/handshake.cc
@@ -149,17 +149,15 @@ ssl->ctx->x509_method->hs_flush_cached_ca_names(this); } -SSL_HANDSHAKE *ssl_handshake_new(SSL *ssl) { +UniquePtr<SSL_HANDSHAKE> ssl_handshake_new(SSL *ssl) { UniquePtr<SSL_HANDSHAKE> hs = MakeUnique<SSL_HANDSHAKE>(ssl); if (!hs || !hs->transcript.Init()) { return nullptr; } - return hs.release(); + return hs; } -void ssl_handshake_free(SSL_HANDSHAKE *hs) { Delete(hs); } - bool ssl_check_message_type(SSL *ssl, const SSLMessage &msg, int type) { if (msg.type != type) { ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_UNEXPECTED_MESSAGE); @@ -282,7 +280,7 @@ enum ssl_verify_result_t ssl_verify_peer_cert(SSL_HANDSHAKE *hs) { SSL *const ssl = hs->ssl; - const SSL_SESSION *prev_session = ssl->s3->established_session; + const SSL_SESSION *prev_session = ssl->s3->established_session.get(); if (prev_session != NULL) { // If renegotiating, the server must not change the server certificate. See // https://mitls.org/pages/attacks/3SHAKE. We never resume on renegotiation,
diff --git a/ssl/handshake_client.cc b/ssl/handshake_client.cc index 5466b56..ff8ebd8 100644 --- a/ssl/handshake_client.cc +++ b/ssl/handshake_client.cc
@@ -1476,14 +1476,15 @@ if (hs->next_proto_neg_seen) { static const uint8_t kZero[32] = {0}; - size_t padding_len = 32 - ((ssl->s3->next_proto_negotiated_len + 2) % 32); + size_t padding_len = + 32 - ((ssl->s3->next_proto_negotiated.size() + 2) % 32); ScopedCBB cbb; CBB body, child; if (!ssl->method->init_message(ssl, cbb.get(), &body, SSL3_MT_NEXT_PROTO) || !CBB_add_u8_length_prefixed(&body, &child) || - !CBB_add_bytes(&child, ssl->s3->next_proto_negotiated, - ssl->s3->next_proto_negotiated_len) || + !CBB_add_bytes(&child, ssl->s3->next_proto_negotiated.data(), + ssl->s3->next_proto_negotiated.size()) || !CBB_add_u8_length_prefixed(&body, &child) || !CBB_add_bytes(&child, kZero, padding_len) || !ssl_add_message_cbb(ssl, cbb.get())) { @@ -1517,8 +1518,8 @@ // False Start only for TLS 1.2 with an ECDHE+AEAD cipher and ALPN or NPN. return !SSL_is_dtls(ssl) && SSL_version(ssl) == TLS1_2_VERSION && - (ssl->s3->alpn_selected != NULL || - ssl->s3->next_proto_negotiated != NULL) && + (!ssl->s3->alpn_selected.empty() || + !ssl->s3->next_proto_negotiated.empty()) && hs->new_cipher->algorithm_mkey == SSL_kECDHE && hs->new_cipher->algorithm_mac == SSL_AEAD; } @@ -1664,18 +1665,16 @@ ssl->method->on_handshake_complete(ssl); - SSL_SESSION_free(ssl->s3->established_session); if (ssl->session != NULL) { SSL_SESSION_up_ref(ssl->session); - ssl->s3->established_session = ssl->session; + ssl->s3->established_session.reset(ssl->session); } else { // We make a copy of the session in order to maintain the immutability // of the new established_session due to False Start. The caller may // have taken a reference to the temporary session. ssl->s3->established_session = - SSL_SESSION_dup(hs->new_session.get(), SSL_SESSION_DUP_ALL) - .release(); - if (ssl->s3->established_session == NULL) { + SSL_SESSION_dup(hs->new_session.get(), SSL_SESSION_DUP_ALL); + if (!ssl->s3->established_session) { return ssl_hs_error; } // Renegotiations do not participate in session resumption.
diff --git a/ssl/handshake_server.cc b/ssl/handshake_server.cc index 7b282d8..d346875 100644 --- a/ssl/handshake_server.cc +++ b/ssl/handshake_server.cc
@@ -1392,8 +1392,7 @@ return ssl_hs_error; } - if (!CBS_stow(&selected_protocol, &ssl->s3->next_proto_negotiated, - &ssl->s3->next_proto_negotiated_len)) { + if (!ssl->s3->next_proto_negotiated.CopyFrom(selected_protocol)) { return ssl_hs_error; } @@ -1510,12 +1509,11 @@ ssl->ctx->x509_method->session_clear(hs->new_session.get()); } - SSL_SESSION_free(ssl->s3->established_session); if (ssl->session != NULL) { SSL_SESSION_up_ref(ssl->session); - ssl->s3->established_session = ssl->session; + ssl->s3->established_session.reset(ssl->session); } else { - ssl->s3->established_session = hs->new_session.release(); + ssl->s3->established_session = std::move(hs->new_session); ssl->s3->established_session->not_resumable = 0; }
diff --git a/ssl/internal.h b/ssl/internal.h index 8c373d2..e76be27 100644 --- a/ssl/internal.h +++ b/ssl/internal.h
@@ -1486,10 +1486,7 @@ uint16_t early_data_written = 0; }; -SSL_HANDSHAKE *ssl_handshake_new(SSL *ssl); - -// ssl_handshake_free releases all memory associated with |hs|. -void ssl_handshake_free(SSL_HANDSHAKE *hs); +UniquePtr<SSL_HANDSHAKE> ssl_handshake_new(SSL *ssl); // ssl_check_message_type checks if |msg| has type |type|. If so it returns // one. Otherwise, it sends an alert and returns zero. @@ -2196,7 +2193,7 @@ // read_error, if |read_shutdown| is |ssl_shutdown_error|, is the error for // the receive half of the connection. - ERR_SAVE_STATE *read_error = nullptr; + UniquePtr<ERR_SAVE_STATE> read_error; int alert_dispatch = 0; @@ -2263,21 +2260,21 @@ // pending_flight is the pending outgoing flight. This is used to flush each // handshake flight in a single write. |write_buffer| must be written out // before this data. - BUF_MEM *pending_flight = nullptr; + UniquePtr<BUF_MEM> pending_flight; // pending_flight_offset is the number of bytes of |pending_flight| which have // been successfully written. uint32_t pending_flight_offset = 0; // aead_read_ctx is the current read cipher state. - SSLAEADContext *aead_read_ctx = nullptr; + UniquePtr<SSLAEADContext> aead_read_ctx; // aead_write_ctx is the current write cipher state. - SSLAEADContext *aead_write_ctx = nullptr; + UniquePtr<SSLAEADContext> aead_write_ctx; // hs is the handshake state for the current handshake or NULL if there isn't // one. - SSL_HANDSHAKE *hs = nullptr; + UniquePtr<SSL_HANDSHAKE> hs; uint8_t write_traffic_secret[EVP_MAX_MD_SIZE] = {0}; uint8_t read_traffic_secret[EVP_MAX_MD_SIZE] = {0}; @@ -2307,7 +2304,7 @@ // established_session is the session established by the connection. This // session is only filled upon the completion of the handshake and is // immutable. - SSL_SESSION *established_session = nullptr; + UniquePtr<SSL_SESSION> established_session; // Next protocol negotiation. For the client, this is the protocol that we // sent in NextProtocol and is set when handling ServerHello extensions. @@ -2315,8 +2312,7 @@ // For a server, this is the client's selected_protocol from NextProtocol and // is set when handling the NextProtocol message, before the Finished // message. - uint8_t *next_proto_negotiated = nullptr; - size_t next_proto_negotiated_len = 0; + Array<uint8_t> next_proto_negotiated; // ALPN information // (we are in the process of transitioning from NPN to ALPN.) @@ -2324,11 +2320,10 @@ // In a server these point to the selected ALPN protocol after the // ClientHello has been processed. In a client these contain the protocol // that the server selected once the ServerHello has been processed. - uint8_t *alpn_selected = nullptr; - size_t alpn_selected_len = 0; + Array<uint8_t> alpn_selected; // hostname, on the server, is the value of the SNI extension. - char *hostname = nullptr; + UniquePtr<char> hostname; // For a server: // If |tlsext_channel_id_valid| is true, then this contains the
diff --git a/ssl/s3_both.cc b/ssl/s3_both.cc index 8c41179..e29d19f 100644 --- a/ssl/s3_both.cc +++ b/ssl/s3_both.cc
@@ -137,9 +137,9 @@ // We'll never add a flight while in the process of writing it out. assert(ssl->s3->pending_flight_offset == 0); - if (ssl->s3->pending_flight == NULL) { - ssl->s3->pending_flight = BUF_MEM_new(); - if (ssl->s3->pending_flight == NULL) { + if (ssl->s3->pending_flight == nullptr) { + ssl->s3->pending_flight.reset(BUF_MEM_new()); + if (ssl->s3->pending_flight == nullptr) { return false; } } @@ -152,7 +152,7 @@ } size_t len; - if (!BUF_MEM_reserve(ssl->s3->pending_flight, new_cap) || + if (!BUF_MEM_reserve(ssl->s3->pending_flight.get(), new_cap) || !tls_seal_record(ssl, (uint8_t *)ssl->s3->pending_flight->data + ssl->s3->pending_flight->length, @@ -229,7 +229,7 @@ } int ssl3_flush_flight(SSL *ssl) { - if (ssl->s3->pending_flight == NULL) { + if (ssl->s3->pending_flight == nullptr) { return 1; } @@ -273,8 +273,7 @@ return -1; } - BUF_MEM_free(ssl->s3->pending_flight); - ssl->s3->pending_flight = NULL; + ssl->s3->pending_flight.reset(); ssl->s3->pending_flight_offset = 0; return 1; }
diff --git a/ssl/s3_lib.cc b/ssl/s3_lib.cc index f69005b..b925cd7 100644 --- a/ssl/s3_lib.cc +++ b/ssl/s3_lib.cc
@@ -177,39 +177,21 @@ key_update_pending(false), wpend_pending(false) {} -SSL3_STATE::~SSL3_STATE() { - ERR_SAVE_STATE_free(read_error); - SSL_SESSION_free(established_session); - ssl_handshake_free(hs); - OPENSSL_free(next_proto_negotiated); - OPENSSL_free(alpn_selected); - OPENSSL_free(hostname); - Delete(aead_read_ctx); - Delete(aead_write_ctx); - BUF_MEM_free(pending_flight); -} +SSL3_STATE::~SSL3_STATE() {} bool ssl3_new(SSL *ssl) { - UniquePtr<SSLAEADContext> aead_read_ctx = - SSLAEADContext::CreateNullCipher(SSL_is_dtls(ssl)); - UniquePtr<SSLAEADContext> aead_write_ctx = - SSLAEADContext::CreateNullCipher(SSL_is_dtls(ssl)); - if (!aead_read_ctx || !aead_write_ctx) { - return false; - } - UniquePtr<SSL3_STATE> s3 = MakeUnique<SSL3_STATE>(); if (!s3) { return false; } + s3->aead_read_ctx = SSLAEADContext::CreateNullCipher(SSL_is_dtls(ssl)); + s3->aead_write_ctx = SSLAEADContext::CreateNullCipher(SSL_is_dtls(ssl)); s3->hs = ssl_handshake_new(ssl); - if (s3->hs == NULL) { + if (!s3->aead_read_ctx || !s3->aead_write_ctx || !s3->hs) { return false; } - s3->aead_read_ctx = aead_read_ctx.release(); - s3->aead_write_ctx = aead_write_ctx.release(); ssl->s3 = s3.release(); // Set the version to the highest supported version.
diff --git a/ssl/s3_pkt.cc b/ssl/s3_pkt.cc index ad4f82a..c4ccecc 100644 --- a/ssl/s3_pkt.cc +++ b/ssl/s3_pkt.cc
@@ -235,7 +235,7 @@ } size_t flight_len = 0; - if (ssl->s3->pending_flight != NULL) { + if (ssl->s3->pending_flight != nullptr) { flight_len = ssl->s3->pending_flight->length - ssl->s3->pending_flight_offset; } @@ -255,13 +255,12 @@ // acknowledgment or 0-RTT key change messages. |pending_flight| must be clear // when data is added to |write_buffer| or it will be written in the wrong // order. - if (ssl->s3->pending_flight != NULL) { + if (ssl->s3->pending_flight != nullptr) { OPENSSL_memcpy( buf->remaining().data(), ssl->s3->pending_flight->data + ssl->s3->pending_flight_offset, flight_len); - BUF_MEM_free(ssl->s3->pending_flight); - ssl->s3->pending_flight = NULL; + ssl->s3->pending_flight.reset(); ssl->s3->pending_flight_offset = 0; buf->DidWrite(flight_len); }
diff --git a/ssl/ssl_lib.cc b/ssl/ssl_lib.cc index f5d1202..c8e6c94 100644 --- a/ssl/ssl_lib.cc +++ b/ssl/ssl_lib.cc
@@ -208,13 +208,12 @@ void ssl_set_read_error(SSL* ssl) { ssl->s3->read_shutdown = ssl_shutdown_error; - ERR_SAVE_STATE_free(ssl->s3->read_error); - ssl->s3->read_error = ERR_save_state(); + ssl->s3->read_error.reset(ERR_save_state()); } static bool check_read_error(const SSL *ssl) { if (ssl->s3->read_shutdown == ssl_shutdown_error) { - ERR_restore_state(ssl->s3->read_error); + ERR_restore_state(ssl->s3->read_error.get()); return false; } return true; @@ -300,16 +299,16 @@ // A client may see new sessions on abbreviated handshakes if the server // decides to renew the ticket. Once the handshake is completed, it should be // inserted into the cache. - if (ssl->s3->established_session != ssl->session || + if (ssl->s3->established_session.get() != ssl->session || (!ssl->server && hs->ticket_expected)) { if (use_internal_cache) { - SSL_CTX_add_session(ctx, ssl->s3->established_session); + SSL_CTX_add_session(ctx, ssl->s3->established_session.get()); } if (ctx->new_session_cb != NULL) { - SSL_SESSION_up_ref(ssl->s3->established_session); - if (!ctx->new_session_cb(ssl, ssl->s3->established_session)) { + SSL_SESSION_up_ref(ssl->s3->established_session.get()); + if (!ctx->new_session_cb(ssl, ssl->s3->established_session.get())) { // |new_session_cb|'s return value signals whether it took ownership. - SSL_SESSION_free(ssl->s3->established_session); + SSL_SESSION_free(ssl->s3->established_session.get()); } } } @@ -860,7 +859,7 @@ } // Run the handshake. - SSL_HANDSHAKE *hs = ssl->s3->hs; + SSL_HANDSHAKE *hs = ssl->s3->hs.get(); bool early_return = false; int ret = ssl_run_handshake(hs, &early_return); @@ -872,8 +871,7 @@ // Destroy the handshake object if the handshake has completely finished. if (!early_return) { - ssl_handshake_free(ssl->s3->hs); - ssl->s3->hs = NULL; + ssl->s3->hs.reset(); } return 1; @@ -943,12 +941,12 @@ } // Begin a new handshake. - if (ssl->s3->hs != NULL) { + if (ssl->s3->hs != nullptr) { OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR); return 0; } ssl->s3->hs = ssl_handshake_new(ssl); - if (ssl->s3->hs == NULL) { + if (ssl->s3->hs == nullptr) { return 0; } @@ -1125,7 +1123,7 @@ // time out because the peer never received our close_notify. Report to // the caller that the channel has fully shut down. if (ssl->s3->read_shutdown == ssl_shutdown_error) { - ERR_restore_state(ssl->s3->read_error); + ERR_restore_state(ssl->s3->read_error.get()); return -1; } ssl->s3->read_shutdown = ssl_shutdown_close_notify; @@ -1190,7 +1188,7 @@ } void SSL_reset_early_data_reject(SSL *ssl) { - SSL_HANDSHAKE *hs = ssl->s3->hs; + SSL_HANDSHAKE *hs = ssl->s3->hs.get(); if (hs == NULL || hs->wait != ssl_hs_early_data_rejected) { abort(); @@ -1863,7 +1861,7 @@ return ssl->tlsext_hostname; } - return ssl->s3->hostname; + return ssl->s3->hostname.get(); } int SSL_get_servername_type(const SSL *ssl) { @@ -1996,8 +1994,8 @@ void SSL_get0_next_proto_negotiated(const SSL *ssl, const uint8_t **out_data, unsigned *out_len) { - *out_data = ssl->s3->next_proto_negotiated; - *out_len = ssl->s3->next_proto_negotiated_len; + *out_data = ssl->s3->next_proto_negotiated.data(); + *out_len = ssl->s3->next_proto_negotiated.size(); } void SSL_CTX_set_next_protos_advertised_cb( @@ -2054,8 +2052,8 @@ *out_data = ssl->s3->hs->early_session->early_alpn; *out_len = ssl->s3->hs->early_session->early_alpn_len; } else { - *out_data = ssl->s3->alpn_selected; - *out_len = ssl->s3->alpn_selected_len; + *out_data = ssl->s3->alpn_selected.data(); + *out_len = ssl->s3->alpn_selected.size(); } } @@ -2434,7 +2432,7 @@ // This returns false once all the handshake state has been finalized, to // allow callbacks and getters based on SSL_in_init to return the correct // values. - SSL_HANDSHAKE *hs = ssl->s3->hs; + SSL_HANDSHAKE *hs = ssl->s3->hs.get(); return hs != nullptr && !hs->handshake_finalized; } @@ -2547,7 +2545,7 @@ } const SSL_CIPHER *SSL_get_pending_cipher(const SSL *ssl) { - SSL_HANDSHAKE *hs = ssl->s3->hs; + SSL_HANDSHAKE *hs = ssl->s3->hs.get(); if (hs == NULL) { return NULL; } @@ -2574,10 +2572,10 @@ // In OpenSSL, reusing a client |SSL| with |SSL_clear| causes the previously // established session to be offered the next time around. wpa_supplicant // depends on this behavior, so emulate it. - SSL_SESSION *session = NULL; + UniquePtr<SSL_SESSION> session; if (!ssl->server && ssl->s3->established_session != NULL) { - session = ssl->s3->established_session; - SSL_SESSION_up_ref(session); + session.reset(ssl->s3->established_session.get()); + SSL_SESSION_up_ref(session.get()); } // TODO(davidben): Some state on |ssl| is reset both in |SSL_new| and @@ -2602,7 +2600,6 @@ ssl->method->ssl_free(ssl); if (!ssl->method->ssl_new(ssl)) { - SSL_SESSION_free(session); return 0; } @@ -2610,9 +2607,8 @@ ssl->d1->mtu = mtu; } - if (session != NULL) { - SSL_set_session(ssl, session); - SSL_SESSION_free(session); + if (session != nullptr) { + SSL_set_session(ssl, session.get()); } return 1;
diff --git a/ssl/ssl_session.cc b/ssl/ssl_session.cc index ea3c53f..34e7b31 100644 --- a/ssl/ssl_session.cc +++ b/ssl/ssl_session.cc
@@ -999,9 +999,9 @@ // we return the intermediate session, either |session| (for resumption) or // |new_session| if doing a full handshake. if (!SSL_in_init(ssl)) { - return ssl->s3->established_session; + return ssl->s3->established_session.get(); } - SSL_HANDSHAKE *hs = ssl->s3->hs; + SSL_HANDSHAKE *hs = ssl->s3->hs.get(); if (hs->early_session) { return hs->early_session.get(); }
diff --git a/ssl/ssl_stat.cc b/ssl/ssl_stat.cc index 37e0324..01153e9 100644 --- a/ssl/ssl_stat.cc +++ b/ssl/ssl_stat.cc
@@ -89,12 +89,12 @@ const char *SSL_state_string_long(const SSL *ssl) { - if (ssl->s3->hs == NULL) { + if (ssl->s3->hs == nullptr) { return "SSL negotiation finished successfully"; } - return ssl->server ? ssl_server_handshake_state(ssl->s3->hs) - : ssl_client_handshake_state(ssl->s3->hs); + return ssl->server ? ssl_server_handshake_state(ssl->s3->hs.get()) + : ssl_client_handshake_state(ssl->s3->hs.get()); } const char *SSL_state_string(const SSL *ssl) {
diff --git a/ssl/t1_lib.cc b/ssl/t1_lib.cc index 5d85cb0..09110dd 100644 --- a/ssl/t1_lib.cc +++ b/ssl/t1_lib.cc
@@ -640,10 +640,12 @@ } // Copy the hostname as a string. - if (!CBS_strdup(&host_name, &ssl->s3->hostname)) { + char *raw = nullptr; + if (!CBS_strdup(&host_name, &raw)) { *out_alert = SSL_AD_INTERNAL_ERROR; return false; } + ssl->s3->hostname.reset(raw); hs->should_ack_sni = true; return true; @@ -862,7 +864,7 @@ } // Whether EMS is negotiated may not change on renegotiation. - if (ssl->s3->established_session != NULL && + if (ssl->s3->established_session != nullptr && hs->extended_master_secret != !!ssl->s3->established_session->extended_master_secret) { OPENSSL_PUT_ERROR(SSL, SSL_R_RENEGOTIATION_EMS_MISMATCH); @@ -1150,7 +1152,7 @@ assert(!SSL_is_dtls(ssl)); assert(ssl->ctx->next_proto_select_cb != NULL); - if (ssl->s3->alpn_selected != NULL) { + if (!ssl->s3->alpn_selected.empty()) { // NPN and ALPN may not be negotiated in the same connection. *out_alert = SSL_AD_ILLEGAL_PARAMETER; OPENSSL_PUT_ERROR(SSL, SSL_R_NEGOTIATED_BOTH_NPN_AND_ALPN); @@ -1172,22 +1174,14 @@ uint8_t selected_len; if (ssl->ctx->next_proto_select_cb( ssl, &selected, &selected_len, orig_contents, orig_len, - ssl->ctx->next_proto_select_cb_arg) != SSL_TLSEXT_ERR_OK) { + ssl->ctx->next_proto_select_cb_arg) != SSL_TLSEXT_ERR_OK || + !ssl->s3->next_proto_negotiated.CopyFrom( + MakeConstSpan(selected, selected_len))) { *out_alert = SSL_AD_INTERNAL_ERROR; return false; } - OPENSSL_free(ssl->s3->next_proto_negotiated); - ssl->s3->next_proto_negotiated = - (uint8_t *)BUF_memdup(selected, selected_len); - if (ssl->s3->next_proto_negotiated == NULL) { - *out_alert = SSL_AD_INTERNAL_ERROR; - return false; - } - - ssl->s3->next_proto_negotiated_len = selected_len; hs->next_proto_neg_seen = true; - return true; } @@ -1417,8 +1411,7 @@ } } - if (!CBS_stow(&protocol_name, &ssl->s3->alpn_selected, - &ssl->s3->alpn_selected_len)) { + if (!ssl->s3->alpn_selected.CopyFrom(protocol_name)) { *out_alert = SSL_AD_INTERNAL_ERROR; return false; } @@ -1470,13 +1463,11 @@ ssl, &selected, &selected_len, CBS_data(&protocol_name_list), CBS_len(&protocol_name_list), ssl->ctx->alpn_select_cb_arg) == SSL_TLSEXT_ERR_OK) { - OPENSSL_free(ssl->s3->alpn_selected); - ssl->s3->alpn_selected = (uint8_t *)BUF_memdup(selected, selected_len); - if (ssl->s3->alpn_selected == NULL) { + if (!ssl->s3->alpn_selected.CopyFrom( + MakeConstSpan(selected, selected_len))) { *out_alert = SSL_AD_INTERNAL_ERROR; return false; } - ssl->s3->alpn_selected_len = selected_len; } return true; @@ -1484,7 +1475,7 @@ static bool ext_alpn_add_serverhello(SSL_HANDSHAKE *hs, CBB *out) { SSL *const ssl = hs->ssl; - if (ssl->s3->alpn_selected == NULL) { + if (ssl->s3->alpn_selected.empty()) { return true; } @@ -1493,8 +1484,8 @@ !CBB_add_u16_length_prefixed(out, &contents) || !CBB_add_u16_length_prefixed(&contents, &proto_list) || !CBB_add_u8_length_prefixed(&proto_list, &proto) || - !CBB_add_bytes(&proto, ssl->s3->alpn_selected, - ssl->s3->alpn_selected_len) || + !CBB_add_bytes(&proto, ssl->s3->alpn_selected.data(), + ssl->s3->alpn_selected.size()) || !CBB_flush(out)) { return false; }
diff --git a/ssl/tls13_client.cc b/ssl/tls13_client.cc index a03c581..b6307ee 100644 --- a/ssl/tls13_client.cc +++ b/ssl/tls13_client.cc
@@ -390,21 +390,21 @@ } // Store the negotiated ALPN in the session. - if (ssl->s3->alpn_selected != NULL) { + if (!ssl->s3->alpn_selected.empty()) { hs->new_session->early_alpn = (uint8_t *)BUF_memdup( - ssl->s3->alpn_selected, ssl->s3->alpn_selected_len); + ssl->s3->alpn_selected.data(), ssl->s3->alpn_selected.size()); if (hs->new_session->early_alpn == NULL) { ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR); return ssl_hs_error; } - hs->new_session->early_alpn_len = ssl->s3->alpn_selected_len; + hs->new_session->early_alpn_len = ssl->s3->alpn_selected.size(); } if (ssl->early_data_accepted) { if (hs->early_session->cipher != hs->new_session->cipher || - hs->early_session->early_alpn_len != ssl->s3->alpn_selected_len || - OPENSSL_memcmp(hs->early_session->early_alpn, ssl->s3->alpn_selected, - ssl->s3->alpn_selected_len) != 0) { + MakeConstSpan(hs->early_session->early_alpn, + hs->early_session->early_alpn_len) != + ssl->s3->alpn_selected) { OPENSSL_PUT_ERROR(SSL, SSL_R_ALPN_MISMATCH_ON_EARLY_DATA); return ssl_hs_error; } @@ -781,8 +781,8 @@ return 1; } - UniquePtr<SSL_SESSION> session(SSL_SESSION_dup(ssl->s3->established_session, - SSL_SESSION_INCLUDE_NONAUTH)); + UniquePtr<SSL_SESSION> session = SSL_SESSION_dup( + ssl->s3->established_session.get(), SSL_SESSION_INCLUDE_NONAUTH); if (!session) { return 0; }
diff --git a/ssl/tls13_server.cc b/ssl/tls13_server.cc index 09437a5..89c9d46 100644 --- a/ssl/tls13_server.cc +++ b/ssl/tls13_server.cc
@@ -371,8 +371,8 @@ hs->new_session = SSL_SESSION_dup(session.get(), SSL_SESSION_DUP_AUTH_ONLY); - if (// Early data must be acceptable for this ticket. - ssl->cert->enable_early_data && + if (ssl->cert->enable_early_data && + // Early data must be acceptable for this ticket. session->ticket_max_early_data != 0 && // The client must have offered early data. hs->early_data_offered && @@ -381,9 +381,8 @@ // Custom extensions is incompatible with 0-RTT. hs->custom_extensions.received == 0 && // The negotiated ALPN must match the one in the ticket. - ssl->s3->alpn_selected_len == session->early_alpn_len && - OPENSSL_memcmp(ssl->s3->alpn_selected, session->early_alpn, - ssl->s3->alpn_selected_len) == 0) { + ssl->s3->alpn_selected == + MakeConstSpan(session->early_alpn, session->early_alpn_len)) { ssl->early_data_accepted = true; } @@ -412,14 +411,14 @@ hs->new_session->cipher = hs->new_cipher; // Store the initial negotiated ALPN in the session. - if (ssl->s3->alpn_selected != NULL) { + if (!ssl->s3->alpn_selected.empty()) { hs->new_session->early_alpn = (uint8_t *)BUF_memdup( - ssl->s3->alpn_selected, ssl->s3->alpn_selected_len); + ssl->s3->alpn_selected.data(), ssl->s3->alpn_selected.size()); if (hs->new_session->early_alpn == NULL) { ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR); return ssl_hs_error; } - hs->new_session->early_alpn_len = ssl->s3->alpn_selected_len; + hs->new_session->early_alpn_len = ssl->s3->alpn_selected.size(); } if (ssl->ctx->dos_protection_cb != NULL &&
diff --git a/ssl/tls_method.cc b/ssl/tls_method.cc index 94b9e20..157cff4 100644 --- a/ssl/tls_method.cc +++ b/ssl/tls_method.cc
@@ -94,16 +94,14 @@ OPENSSL_memset(ssl->s3->read_sequence, 0, sizeof(ssl->s3->read_sequence)); - Delete(ssl->s3->aead_read_ctx); - ssl->s3->aead_read_ctx = aead_ctx.release(); + ssl->s3->aead_read_ctx = std::move(aead_ctx); return true; } static bool ssl3_set_write_state(SSL *ssl, UniquePtr<SSLAEADContext> aead_ctx) { OPENSSL_memset(ssl->s3->write_sequence, 0, sizeof(ssl->s3->write_sequence)); - Delete(ssl->s3->aead_write_ctx); - ssl->s3->aead_write_ctx = aead_ctx.release(); + ssl->s3->aead_write_ctx = std::move(aead_ctx); return true; }