am 9f64567d: Merge changes Icb667451,Ie08d910b
* commit '9f64567d9f5e7c7db3b62869a1c199f4ff7d3691':
Use template instead of macro to release UniquePtrs.
Make usage of new/delete and malloc/free consistent.
diff --git a/softkeymaster/keymaster_openssl.cpp b/softkeymaster/keymaster_openssl.cpp
index f81e844..5a25b65 100644
--- a/softkeymaster/keymaster_openssl.cpp
+++ b/softkeymaster/keymaster_openssl.cpp
@@ -78,6 +78,12 @@
};
typedef UniquePtr<RSA, RSA_Delete> Unique_RSA;
+struct Malloc_Free {
+ void operator()(void* p) const {
+ free(p);
+ }
+};
+
typedef UniquePtr<keymaster_device_t> Unique_keymaster_device_t;
/**
@@ -86,8 +92,10 @@
* scoped pointers when we've transferred ownership, without
* triggering a warning by not using the result of release().
*/
-#define OWNERSHIP_TRANSFERRED(obj) \
- typeof(obj.release()) _dummy __attribute__((unused)) = obj.release()
+template <typename T, typename Delete_T>
+inline void release_because_ownership_transferred(UniquePtr<T, Delete_T>& p) {
+ T* val __attribute__((unused)) = p.release();
+}
/*
* Checks this thread's OpenSSL error queue and logs if
@@ -123,7 +131,9 @@
*keyBlobLength = get_softkey_header_size() + sizeof(type) + sizeof(publicLen) + privateLen +
sizeof(privateLen) + publicLen;
- UniquePtr<unsigned char> derData(new unsigned char[*keyBlobLength]);
+ // derData will be returned to the caller, so allocate it with malloc.
+ UniquePtr<unsigned char, Malloc_Free> derData(
+ static_cast<unsigned char*>(malloc(*keyBlobLength)));
if (derData.get() == NULL) {
ALOGE("could not allocate memory for key blob");
return -1;
@@ -266,7 +276,7 @@
logOpenSSLError("generate_dsa_keypair");
return -1;
}
- OWNERSHIP_TRANSFERRED(dsa);
+ release_because_ownership_transferred(dsa);
return 0;
}
@@ -323,7 +333,7 @@
logOpenSSLError("generate_ec_keypair");
return -1;
}
- OWNERSHIP_TRANSFERRED(eckey);
+ release_because_ownership_transferred(eckey);
return 0;
}
@@ -357,7 +367,7 @@
logOpenSSLError("generate_rsa_keypair");
return -1;
}
- OWNERSHIP_TRANSFERRED(rsa);
+ release_because_ownership_transferred(rsa);
return 0;
}
@@ -423,7 +433,7 @@
logOpenSSLError("openssl_import_keypair");
return -1;
}
- OWNERSHIP_TRANSFERRED(pkcs8);
+ release_because_ownership_transferred(pkcs8);
if (wrap_key(pkey.get(), EVP_PKEY_type(pkey->type), key_blob, key_blob_length)) {
return -1;
@@ -452,7 +462,7 @@
return -1;
}
- UniquePtr<uint8_t> key(static_cast<uint8_t*>(malloc(len)));
+ UniquePtr<uint8_t, Malloc_Free> key(static_cast<uint8_t*>(malloc(len)));
if (key.get() == NULL) {
ALOGE("Could not allocate memory for public key data");
return -1;
@@ -485,7 +495,7 @@
}
unsigned int dsaSize = DSA_size(dsa.get());
- UniquePtr<uint8_t> signedDataPtr(reinterpret_cast<uint8_t*>(malloc(dsaSize)));
+ UniquePtr<uint8_t, Malloc_Free> signedDataPtr(reinterpret_cast<uint8_t*>(malloc(dsaSize)));
if (signedDataPtr.get() == NULL) {
logOpenSSLError("openssl_sign_dsa");
return -1;
@@ -517,7 +527,7 @@
}
unsigned int ecdsaSize = ECDSA_size(eckey.get());
- UniquePtr<uint8_t> signedDataPtr(reinterpret_cast<uint8_t*>(malloc(ecdsaSize)));
+ UniquePtr<uint8_t, Malloc_Free> signedDataPtr(reinterpret_cast<uint8_t*>(malloc(ecdsaSize)));
if (signedDataPtr.get() == NULL) {
logOpenSSLError("openssl_sign_ec");
return -1;
@@ -551,7 +561,7 @@
return -1;
}
- UniquePtr<uint8_t> signedDataPtr(reinterpret_cast<uint8_t*>(malloc(dataLength)));
+ UniquePtr<uint8_t, Malloc_Free> signedDataPtr(reinterpret_cast<uint8_t*>(malloc(dataLength)));
if (signedDataPtr.get() == NULL) {
logOpenSSLError("openssl_sign_rsa");
return -1;
@@ -673,7 +683,7 @@
return -1;
}
- UniquePtr<uint8_t> dataPtr(reinterpret_cast<uint8_t*>(malloc(signedDataLength)));
+ UniquePtr<uint8_t[]> dataPtr(new uint8_t[signedDataLength]);
if (dataPtr.get() == NULL) {
logOpenSSLError("openssl_verify_data");
return -1;