提交 e4dc18d7 编写于 作者: G Geoff Thorpe

Actually there were two error cases that could return without releasing the

lock - stupidly, my last change addressed only one of them.
上级 3f86a2b1
...@@ -288,20 +288,21 @@ EVP_PKEY *ENGINE_load_public_key(ENGINE *e, const char *key_id, ...@@ -288,20 +288,21 @@ EVP_PKEY *ENGINE_load_public_key(ENGINE *e, const char *key_id,
int ENGINE_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)()) int ENGINE_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)())
{ {
int ctrl_exists; int ctrl_exists, ref_exists;
if(e == NULL) if(e == NULL)
{ {
ENGINEerr(ENGINE_F_ENGINE_CTRL,ERR_R_PASSED_NULL_PARAMETER); ENGINEerr(ENGINE_F_ENGINE_CTRL,ERR_R_PASSED_NULL_PARAMETER);
return 0; return 0;
} }
CRYPTO_w_lock(CRYPTO_LOCK_ENGINE); CRYPTO_w_lock(CRYPTO_LOCK_ENGINE);
if(e->struct_ref == 0) ref_exists = ((e->struct_ref > 0) ? 1 : 0);
ctrl_exists = (e->ctrl ? 1 : 0);
CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE);
if(!ref_exists)
{ {
ENGINEerr(ENGINE_F_ENGINE_CTRL,ENGINE_R_NO_REFERENCE); ENGINEerr(ENGINE_F_ENGINE_CTRL,ENGINE_R_NO_REFERENCE);
return 0; return 0;
} }
ctrl_exists = (e->ctrl ? 1 : 0);
CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE);
if (!ctrl_exists) if (!ctrl_exists)
{ {
ENGINEerr(ENGINE_F_ENGINE_CTRL,ENGINE_R_NO_CONTROL_FUNCTION); ENGINEerr(ENGINE_F_ENGINE_CTRL,ENGINE_R_NO_CONTROL_FUNCTION);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册