summaryrefslogtreecommitdiffstats
path: root/crypto/userspace/ncr-sessions.c
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/userspace/ncr-sessions.c')
-rw-r--r--crypto/userspace/ncr-sessions.c11
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;
}