Support EVP_PKEY_meth_remove and pmeth internal cleanup
authorPaul Yang <yang.yang@baishancloud.com>
Mon, 11 Sep 2017 15:15:55 +0000 (23:15 +0800)
committerPaul Yang <yang.yang@baishancloud.com>
Thu, 14 Sep 2017 04:41:34 +0000 (12:41 +0800)
1. make app pkey methods cleanup internal
2. add EVP_PKEY_meth_remove

Fixes travis-ci failure in #4337

Reviewed-by: Richard Levitte <levitte@openssl.org>
Reviewed-by: Paul Dale <paul.dale@oracle.com>
Reviewed-by: Rich Salz <rsalz@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/4356)

crypto/evp/names.c
crypto/evp/pmeth_lib.c
crypto/include/internal/evp_int.h
doc/man3/EVP_PKEY_meth_new.pod
include/openssl/evp.h
test/evp_extra_test.c
util/libcrypto.num

index 41c3ceee3adc9a0ce96842cd0b7c145f9f6212ac..11905690b8025b5437f1d92c95fcaaf555e7e387 100644 (file)
@@ -90,6 +90,8 @@ void evp_cleanup_int(void)
 
     EVP_PBE_cleanup();
     OBJ_sigid_free();
+
+    evp_app_cleanup_int();
 }
 
 struct doall_cipher {
index c62bd81da41b31d0438f9b12bc664184b3b48944..2b9b8a92f8356b4518b7d25bf6832ba79086c418 100644 (file)
@@ -296,6 +296,21 @@ int EVP_PKEY_meth_add0(const EVP_PKEY_METHOD *pmeth)
     return 1;
 }
 
+void evp_app_cleanup_int(void)
+{
+    if (app_pkey_methods != NULL)
+        sk_EVP_PKEY_METHOD_pop_free(app_pkey_methods, EVP_PKEY_meth_free);
+}
+
+int EVP_PKEY_meth_remove(const EVP_PKEY_METHOD *pmeth)
+{
+    const EVP_PKEY_METHOD *ret;
+
+    ret = sk_EVP_PKEY_METHOD_delete_ptr(app_pkey_methods, pmeth);
+
+    return ret == NULL ? 0 : 1;
+}
+
 size_t EVP_PKEY_meth_get_count(void)
 {
     size_t rv = OSSL_NELEM(standard_methods);
index b9558a60d4b9148f130e90fc038c90eaaef6c02d..ccfa97ce355d3fac40c5872e557b48bdf48b4559 100644 (file)
@@ -393,6 +393,7 @@ struct evp_pkey_st {
 void openssl_add_all_ciphers_int(void);
 void openssl_add_all_digests_int(void);
 void evp_cleanup_int(void);
+void evp_app_cleanup_int(void);
 
 /* Pulling defines out of C soure files */
 
index acff78a16c777377b9b6c938ba63c3e41f53960f..498e33271af6b777f220f2b7154c885eab81fe0f 100644 (file)
@@ -13,7 +13,8 @@ EVP_PKEY_meth_get_init, EVP_PKEY_meth_get_copy, EVP_PKEY_meth_get_cleanup,
 EVP_PKEY_meth_get_paramgen, EVP_PKEY_meth_get_keygen, EVP_PKEY_meth_get_sign,
 EVP_PKEY_meth_get_verify, EVP_PKEY_meth_get_verify_recover, EVP_PKEY_meth_get_signctx,
 EVP_PKEY_meth_get_verifyctx, EVP_PKEY_meth_get_encrypt, EVP_PKEY_meth_get_decrypt,
-EVP_PKEY_meth_get_derive, EVP_PKEY_meth_get_ctrl, EVP_PKEY_meth_get_check
+EVP_PKEY_meth_get_derive, EVP_PKEY_meth_get_ctrl, EVP_PKEY_meth_get_check,
+EVP_PKEY_meth_remove
 - manipulating EVP_PKEY_METHOD structure
 
 =head1 SYNOPSIS
@@ -27,6 +28,7 @@ EVP_PKEY_meth_get_derive, EVP_PKEY_meth_get_ctrl, EVP_PKEY_meth_get_check
  void EVP_PKEY_meth_copy(EVP_PKEY_METHOD *dst, const EVP_PKEY_METHOD *src);
  const EVP_PKEY_METHOD *EVP_PKEY_meth_find(int type);
  int EVP_PKEY_meth_add0(const EVP_PKEY_METHOD *pmeth);
+ int EVP_PKEY_meth_remove(const EVP_PKEY_METHOD *pmeth);
 
  void EVP_PKEY_meth_set_init(EVP_PKEY_METHOD *pmeth,
                              int (*init) (EVP_PKEY_CTX *ctx));
@@ -350,6 +352,9 @@ then the built-in objects.
 
 EVP_PKEY_meth_add0() adds B<pmeth> to the user defined stack of methods.
 
+EVP_PKEY_meth_remove() removes an B<EVP_PKEY_METHOD> object added by
+EVP_PKEY_meth_new().
+
 The EVP_PKEY_meth_set functions set the corresponding fields of
 B<EVP_PKEY_METHOD> structure with the arguments passed.
 
@@ -369,6 +374,9 @@ object or returns NULL if not found.
 EVP_PKEY_meth_add0() returns 1 if method is added successfully or 0
 if an error occurred.
 
+EVP_PKEY_meth_remove() returns 1 if method is removed successfully or
+0 if an error occurred.
+
 All EVP_PKEY_meth_set and EVP_PKEY_meth_get functions have no return
 values. For the 'get' functions, function pointers are returned by
 arguments.
index 2c01bdf4fdafa7020c59e4b55f44b848351d2583..34c009a4a4f173b8062aedba638443d896f7f3fc 100644 (file)
@@ -1276,6 +1276,7 @@ void EVP_PKEY_meth_get0_info(int *ppkey_id, int *pflags,
 void EVP_PKEY_meth_copy(EVP_PKEY_METHOD *dst, const EVP_PKEY_METHOD *src);
 void EVP_PKEY_meth_free(EVP_PKEY_METHOD *pmeth);
 int EVP_PKEY_meth_add0(const EVP_PKEY_METHOD *pmeth);
+int EVP_PKEY_meth_remove(const EVP_PKEY_METHOD *pmeth);
 size_t EVP_PKEY_meth_get_count(void);
 const EVP_PKEY_METHOD *EVP_PKEY_meth_get0(size_t idx);
 
index 221f9a6d101c749f10205fb95771207e3872765d..f49ca80bf790493bb81bd9570eaa122a4c14fce2 100644 (file)
@@ -524,8 +524,3 @@ int setup_tests(void)
     ADD_ALL_TESTS(test_EVP_PKEY_check, OSSL_NELEM(keycheckdata));
     return 1;
 }
-
-void cleanup_tests(void)
-{
-    EVP_PKEY_meth_free(custom_pmeth);
-}
index 35c05dae88f1779152c137ab2c5441a9d412ea7d..363059be4cba9e991a830da37e7959ce19e583de 100644 (file)
@@ -4396,3 +4396,4 @@ UI_get_result_string_length             4339      1_1_1   EXIST::FUNCTION:
 EVP_PKEY_check                          4340   1_1_1   EXIST::FUNCTION:
 EVP_PKEY_meth_set_check                 4341   1_1_1   EXIST::FUNCTION:
 EVP_PKEY_meth_get_check                 4342   1_1_1   EXIST::FUNCTION:
+EVP_PKEY_meth_remove                    4343   1_1_1   EXIST::FUNCTION: