Fix softkeymaster EC group memory leak.
EC_KEY_set_group dups the group passed to it rather than taking ownership.
Change-Id: Id9560b588130ee8be506983cf70aaf79a11bb6e7
diff --git a/softkeymaster/keymaster_openssl.cpp b/softkeymaster/keymaster_openssl.cpp
index 5a25b65..85ecc6e 100644
--- a/softkeymaster/keymaster_openssl.cpp
+++ b/softkeymaster/keymaster_openssl.cpp
@@ -71,6 +71,13 @@
};
typedef UniquePtr<EC_KEY, EC_KEY_Delete> Unique_EC_KEY;
+struct EC_GROUP_Delete {
+ void operator()(EC_GROUP* p) const {
+ EC_GROUP_free(p);
+ }
+};
+typedef UniquePtr<EC_GROUP, EC_GROUP_Delete> Unique_EC_GROUP;
+
struct RSA_Delete {
void operator()(RSA* p) const {
RSA_free(p);
@@ -282,35 +289,34 @@
}
static int generate_ec_keypair(EVP_PKEY* pkey, const keymaster_ec_keygen_params_t* ec_params) {
- EC_GROUP* group;
+ Unique_EC_GROUP group;
switch (ec_params->field_size) {
case 192:
- group = EC_GROUP_new_by_curve_name(NID_X9_62_prime192v1);
+ group.reset(EC_GROUP_new_by_curve_name(NID_X9_62_prime192v1));
break;
case 224:
- group = EC_GROUP_new_by_curve_name(NID_secp224r1);
+ group.reset(EC_GROUP_new_by_curve_name(NID_secp224r1));
break;
case 256:
- group = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1);
+ group.reset(EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1));
break;
case 384:
- group = EC_GROUP_new_by_curve_name(NID_secp384r1);
+ group.reset(EC_GROUP_new_by_curve_name(NID_secp384r1));
break;
case 521:
- group = EC_GROUP_new_by_curve_name(NID_secp521r1);
+ group.reset(EC_GROUP_new_by_curve_name(NID_secp521r1));
break;
default:
- group = NULL;
break;
}
- if (group == NULL) {
+ if (group.get() == NULL) {
logOpenSSLError("generate_ec_keypair");
return -1;
}
- EC_GROUP_set_point_conversion_form(group, POINT_CONVERSION_UNCOMPRESSED);
- EC_GROUP_set_asn1_flag(group, OPENSSL_EC_NAMED_CURVE);
+ EC_GROUP_set_point_conversion_form(group.get(), POINT_CONVERSION_UNCOMPRESSED);
+ EC_GROUP_set_asn1_flag(group.get(), OPENSSL_EC_NAMED_CURVE);
/* initialize EC key */
Unique_EC_KEY eckey(EC_KEY_new());
@@ -319,7 +325,7 @@
return -1;
}
- if (EC_KEY_set_group(eckey.get(), group) != 1) {
+ if (EC_KEY_set_group(eckey.get(), group.get()) != 1) {
logOpenSSLError("generate_ec_keypair");
return -1;
}