ksmbd: fix deadlock in ksmbd_find_crypto_ctx()
Deadlock is triggered by sending multiple concurrent session setup requests. It should be reused after releasing when getting ctx for crypto. Multiple consecutive ctx uses cause deadlock while waiting for releasing due to the limited number of ctx. Cc: stable@vger.kernel.org Reported-by: zdi-disclosures@trendmicro.com # ZDI-CAN-20591 Signed-off-by: Namjae Jeon <linkinjeon@kernel.org> Signed-off-by: Steve French <stfrench@microsoft.com>
This commit is contained in:
Родитель
b096d97f47
Коммит
7b4323373d
|
@ -221,22 +221,22 @@ int ksmbd_auth_ntlmv2(struct ksmbd_conn *conn, struct ksmbd_session *sess,
|
|||
{
|
||||
char ntlmv2_hash[CIFS_ENCPWD_SIZE];
|
||||
char ntlmv2_rsp[CIFS_HMAC_MD5_HASH_SIZE];
|
||||
struct ksmbd_crypto_ctx *ctx;
|
||||
struct ksmbd_crypto_ctx *ctx = NULL;
|
||||
char *construct = NULL;
|
||||
int rc, len;
|
||||
|
||||
ctx = ksmbd_crypto_ctx_find_hmacmd5();
|
||||
if (!ctx) {
|
||||
ksmbd_debug(AUTH, "could not crypto alloc hmacmd5\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
rc = calc_ntlmv2_hash(conn, sess, ntlmv2_hash, domain_name);
|
||||
if (rc) {
|
||||
ksmbd_debug(AUTH, "could not get v2 hash rc %d\n", rc);
|
||||
goto out;
|
||||
}
|
||||
|
||||
ctx = ksmbd_crypto_ctx_find_hmacmd5();
|
||||
if (!ctx) {
|
||||
ksmbd_debug(AUTH, "could not crypto alloc hmacmd5\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
rc = crypto_shash_setkey(CRYPTO_HMACMD5_TFM(ctx),
|
||||
ntlmv2_hash,
|
||||
CIFS_HMAC_MD5_HASH_SIZE);
|
||||
|
@ -272,6 +272,8 @@ int ksmbd_auth_ntlmv2(struct ksmbd_conn *conn, struct ksmbd_session *sess,
|
|||
ksmbd_debug(AUTH, "Could not generate md5 hash\n");
|
||||
goto out;
|
||||
}
|
||||
ksmbd_release_crypto_ctx(ctx);
|
||||
ctx = NULL;
|
||||
|
||||
rc = ksmbd_gen_sess_key(sess, ntlmv2_hash, ntlmv2_rsp);
|
||||
if (rc) {
|
||||
|
@ -282,7 +284,8 @@ int ksmbd_auth_ntlmv2(struct ksmbd_conn *conn, struct ksmbd_session *sess,
|
|||
if (memcmp(ntlmv2->ntlmv2_hash, ntlmv2_rsp, CIFS_HMAC_MD5_HASH_SIZE) != 0)
|
||||
rc = -EINVAL;
|
||||
out:
|
||||
ksmbd_release_crypto_ctx(ctx);
|
||||
if (ctx)
|
||||
ksmbd_release_crypto_ctx(ctx);
|
||||
kfree(construct);
|
||||
return rc;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче