diff options
Diffstat (limited to 'crypto/userspace/ncr-sessions.c')
-rw-r--r-- | crypto/userspace/ncr-sessions.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/crypto/userspace/ncr-sessions.c b/crypto/userspace/ncr-sessions.c index ff19bad08fd..8dcc7d8abb4 100644 --- a/crypto/userspace/ncr-sessions.c +++ b/crypto/userspace/ncr-sessions.c @@ -121,7 +121,7 @@ struct session_item_st* ncr_session_new(struct list_sem_st* lst) } init_MUTEX(&sess->mem_mutex); - atomic_set(&sess->refcnt, 1); + atomic_set(&sess->refcnt, 2); /* One for lst->list, one for "sess" */ down(&lst->sem); @@ -229,7 +229,7 @@ static int _ncr_session_init(struct ncr_lists* lists, struct ncr_session_st* ses ns = ncr_session_new(&lists->sessions); if (ns == NULL) { err(); - return -EINVAL; + return -ENOMEM; } ns->op = session->op; @@ -263,7 +263,8 @@ static int _ncr_session_init(struct ncr_lists* lists, struct ncr_session_st* ses if (ns->algorithm->kstr == NULL) { err(); - return -EINVAL; + ret = -EINVAL; + goto fail; } ret = cryptodev_cipher_init(&ns->cipher, ns->algorithm->kstr, @@ -342,7 +343,8 @@ static int _ncr_session_init(struct ncr_lists* lists, struct ncr_session_st* ses sign_hash = ncr_key_params_get_sign_hash(ns->key->algorithm, &session->params); if (IS_ERR(sign_hash)) { err(); - return PTR_ERR(sign_hash); + ret = PTR_ERR(sign_hash); + goto fail; } if (!sign_hash->can_digest) { @@ -390,6 +392,7 @@ fail: if (ret < 0) { _ncr_session_remove(&lists->sessions, ns->desc); } + _ncr_sessions_item_put(ns); return ret; } |