Use Array<uint8_t> in DTLS1_OUTGOING_MESSAGE. The destructor is automatic but, as a bonus, it becomes size_t-clean. Costs us 8 more bytes of per-connection memory per outgoing message, which isn't ideal but the previous commit saved even more, and DTLS isn't as important as TLS in that regard. Bug: 516 Change-Id: I69f881169088a11b9f09c4dc3577c47c4b48ce60 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/54467 Commit-Queue: David Benjamin <davidben@google.com> Reviewed-by: Bob Beck <bbe@google.com>
diff --git a/ssl/d1_both.cc b/ssl/d1_both.cc index f8c04b7..3424f6e 100644 --- a/ssl/d1_both.cc +++ b/ssl/d1_both.cc
@@ -487,10 +487,7 @@ // Sending handshake messages. -void DTLS_OUTGOING_MESSAGE::Clear() { - OPENSSL_free(data); - data = nullptr; -} +void DTLS_OUTGOING_MESSAGE::Clear() { data.Reset(); } void dtls_clear_outgoing_messages(SSL *ssl) { for (size_t i = 0; i < ssl->d1->outgoing_messages_len; i++) { @@ -578,9 +575,7 @@ DTLS_OUTGOING_MESSAGE *msg = &ssl->d1->outgoing_messages[ssl->d1->outgoing_messages_len]; - size_t len; - data.Release(&msg->data, &len); - msg->len = len; + msg->data = std::move(data); msg->epoch = ssl->d1->w_epoch; msg->is_ccs = is_ccs; @@ -665,7 +660,7 @@ // DTLS messages are serialized as a single fragment in |msg|. CBS cbs, body; struct hm_header_st hdr; - CBS_init(&cbs, msg->data, msg->len); + CBS_init(&cbs, msg->data.data(), msg->data.size()); if (!dtls1_parse_fragment(&cbs, &hdr, &body) || hdr.frag_off != 0 || hdr.frag_len != CBS_len(&body) ||
diff --git a/ssl/internal.h b/ssl/internal.h index d8df2ab..71ff0ff 100644 --- a/ssl/internal.h +++ b/ssl/internal.h
@@ -1181,12 +1181,10 @@ DTLS_OUTGOING_MESSAGE() {} DTLS_OUTGOING_MESSAGE(const DTLS_OUTGOING_MESSAGE &) = delete; DTLS_OUTGOING_MESSAGE &operator=(const DTLS_OUTGOING_MESSAGE &) = delete; - ~DTLS_OUTGOING_MESSAGE() { Clear(); } void Clear(); - uint8_t *data = nullptr; - uint32_t len = 0; + Array<uint8_t> data; uint16_t epoch = 0; bool is_ccs = false; };