Use the same Deleter across all bssl::UniquePtr<T>.
Template operator() instead of the type. This fixes converting
subclasses with bssl::UniquePtr. std::unique_ptr<T, D> can be converted
to std::unique_ptr<U, E> requires either D == E or for D to be
implicitly convertable to E, along with other conditions. (Notably T*
must be convertible to U*.)
In the real std::unique_ptr, we rely on std::default_delete<T> being
convertable to std::default_delete<U> if T* is convertible to U*. But
rather than write all the SFINAE complexity, I think it suffices to
move the template down a later. This simplifies SSLKeyShare::Create a
little.
Change-Id: I431610f3a69a72dd9def190d3554c89c2d3a4c32
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56385
Commit-Queue: Adam Langley <agl@google.com>
Reviewed-by: Adam Langley <agl@google.com>
Auto-Submit: David Benjamin <davidben@google.com>
diff --git a/include/openssl/base.h b/include/openssl/base.h
index a2fb76b..690b801 100644
--- a/include/openssl/base.h
+++ b/include/openssl/base.h
@@ -529,8 +529,8 @@
template <typename T, typename Enable = void>
struct DeleterImpl {};
-template <typename T>
struct Deleter {
+ template <typename T>
void operator()(T *ptr) {
// Rather than specialize Deleter for each type, we specialize
// DeleterImpl. This allows bssl::UniquePtr<T> to be used while only
@@ -614,7 +614,7 @@
// bssl::UniquePtr<RSA> rsa(RSA_new());
// bssl::UniquePtr<BIO> bio(BIO_new(BIO_s_mem()));
template <typename T>
-using UniquePtr = std::unique_ptr<T, internal::Deleter<T>>;
+using UniquePtr = std::unique_ptr<T, internal::Deleter>;
#define BORINGSSL_MAKE_UP_REF(type, up_ref_func) \
inline UniquePtr<type> UpRef(type *v) { \
diff --git a/ssl/ssl_key_share.cc b/ssl/ssl_key_share.cc
index 33103ad..7c3e7ef 100644
--- a/ssl/ssl_key_share.cc
+++ b/ssl/ssl_key_share.cc
@@ -359,25 +359,21 @@
UniquePtr<SSLKeyShare> SSLKeyShare::Create(uint16_t group_id) {
switch (group_id) {
case SSL_CURVE_SECP224R1:
- return UniquePtr<SSLKeyShare>(
- New<ECKeyShare>(NID_secp224r1, SSL_CURVE_SECP224R1));
+ return MakeUnique<ECKeyShare>(NID_secp224r1, SSL_CURVE_SECP224R1);
case SSL_CURVE_SECP256R1:
- return UniquePtr<SSLKeyShare>(
- New<ECKeyShare>(NID_X9_62_prime256v1, SSL_CURVE_SECP256R1));
+ return MakeUnique<ECKeyShare>(NID_X9_62_prime256v1, SSL_CURVE_SECP256R1);
case SSL_CURVE_SECP384R1:
- return UniquePtr<SSLKeyShare>(
- New<ECKeyShare>(NID_secp384r1, SSL_CURVE_SECP384R1));
+ return MakeUnique<ECKeyShare>(NID_secp384r1, SSL_CURVE_SECP384R1);
case SSL_CURVE_SECP521R1:
- return UniquePtr<SSLKeyShare>(
- New<ECKeyShare>(NID_secp521r1, SSL_CURVE_SECP521R1));
+ return MakeUnique<ECKeyShare>(NID_secp521r1, SSL_CURVE_SECP521R1);
case SSL_CURVE_X25519:
- return UniquePtr<SSLKeyShare>(New<X25519KeyShare>());
+ return MakeUnique<X25519KeyShare>();
case SSL_CURVE_CECPQ2:
- return UniquePtr<SSLKeyShare>(New<CECPQ2KeyShare>());
+ return MakeUnique<CECPQ2KeyShare>();
case SSL_CURVE_X25519KYBER768:
- return UniquePtr<SSLKeyShare>(New<X25519Kyber768KeyShare>());
+ return MakeUnique<X25519Kyber768KeyShare>();
case SSL_CURVE_P256KYBER768:
- return UniquePtr<SSLKeyShare>(New<P256Kyber768KeyShare>());
+ return MakeUnique<P256Kyber768KeyShare>();
default:
return nullptr;
}