From 62450535d90e5b794b3d5b8d850272452106ef3e Mon Sep 17 00:00:00 2001 From: Siqi Lin <siqilin@google.com> Date: Fri, 21 Jul 2017 20:48:12 +0000 Subject: [PATCH] Revert "BACKPORT: crypto: msm: Fix buffer overflow issue" This reverts commit c3fab4bce4a0be463ae4cb08a2837ac6139146b9. Bug: 37438302 Change-Id: Iaf7c367ce3b78188bbd148d9d0854d806592c9f2 Signed-off-by: Siqi Lin <siqilin@google.com> --- drivers/crypto/msm/qcedev.c | 53 +++++++------------------------------ 1 file changed, 10 insertions(+), 43 deletions(-) diff --git a/drivers/crypto/msm/qcedev.c b/drivers/crypto/msm/qcedev.c index cfbd7a9c6716..f8baf287d21f 100644 --- a/drivers/crypto/msm/qcedev.c +++ b/drivers/crypto/msm/qcedev.c @@ -63,7 +63,6 @@ static uint8_t _std_init_vector_sha256_uint8[] = { static DEFINE_MUTEX(send_cmd_lock); static DEFINE_MUTEX(qcedev_sent_bw_req); -static DEFINE_MUTEX(hash_access_lock); static void qcedev_ce_high_bw_req(struct qcedev_control *podev, bool high_bw_req) @@ -1652,18 +1651,12 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) (void __user *)arg, sizeof(struct qcedev_sha_op_req))) return -EFAULT; - mutex_lock(&hash_access_lock); - if (qcedev_check_sha_params(&qcedev_areq.sha_op_req, podev)) { - mutex_unlock(&hash_access_lock); + if (qcedev_check_sha_params(&qcedev_areq.sha_op_req, podev)) return -EINVAL; - } qcedev_areq.op_type = QCEDEV_CRYPTO_OPER_SHA; err = qcedev_hash_init(&qcedev_areq, handle, &sg_src); - if (err) { - mutex_unlock(&hash_access_lock); + if (err) return err; - } - mutex_unlock(&hash_access_lock); if (copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, sizeof(struct qcedev_sha_op_req))) return -EFAULT; @@ -1681,42 +1674,32 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) (void __user *)arg, sizeof(struct qcedev_sha_op_req))) return -EFAULT; - mutex_lock(&hash_access_lock); - if (qcedev_check_sha_params(&qcedev_areq.sha_op_req, podev)) { - mutex_unlock(&hash_access_lock); + if (qcedev_check_sha_params(&qcedev_areq.sha_op_req, podev)) return -EINVAL; - } qcedev_areq.op_type = QCEDEV_CRYPTO_OPER_SHA; if (qcedev_areq.sha_op_req.alg == QCEDEV_ALG_AES_CMAC) { err = qcedev_hash_cmac(&qcedev_areq, handle, &sg_src); - if (err) { - mutex_unlock(&hash_access_lock); + if (err) return err; - } } else { if (handle->sha_ctxt.init_done == false) { pr_err("%s Init was not called\n", __func__); - mutex_unlock(&hash_access_lock); return -EINVAL; } err = qcedev_hash_update(&qcedev_areq, handle, &sg_src); - if (err) { - mutex_unlock(&hash_access_lock); + if (err) return err; - } } if (handle->sha_ctxt.diglen > QCEDEV_MAX_SHA_DIGEST) { pr_err("Invalid sha_ctxt.diglen %d\n", handle->sha_ctxt.diglen); - mutex_unlock(&hash_access_lock); return -EINVAL; } memcpy(&qcedev_areq.sha_op_req.digest[0], &handle->sha_ctxt.digest[0], handle->sha_ctxt.diglen); - mutex_unlock(&hash_access_lock); if (copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, sizeof(struct qcedev_sha_op_req))) return -EFAULT; @@ -1733,29 +1716,22 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) (void __user *)arg, sizeof(struct qcedev_sha_op_req))) return -EFAULT; - mutex_lock(&hash_access_lock); - if (qcedev_check_sha_params(&qcedev_areq.sha_op_req, podev)) { - mutex_unlock(&hash_access_lock); + if (qcedev_check_sha_params(&qcedev_areq.sha_op_req, podev)) return -EINVAL; - } qcedev_areq.op_type = QCEDEV_CRYPTO_OPER_SHA; err = qcedev_hash_final(&qcedev_areq, handle); - if (err) { - mutex_unlock(&hash_access_lock); + if (err) return err; - } if (handle->sha_ctxt.diglen > QCEDEV_MAX_SHA_DIGEST) { pr_err("Invalid sha_ctxt.diglen %d\n", handle->sha_ctxt.diglen); - mutex_unlock(&hash_access_lock); return -EINVAL; } qcedev_areq.sha_op_req.diglen = handle->sha_ctxt.diglen; memcpy(&qcedev_areq.sha_op_req.digest[0], &handle->sha_ctxt.digest[0], handle->sha_ctxt.diglen); - mutex_unlock(&hash_access_lock); if (copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, sizeof(struct qcedev_sha_op_req))) return -EFAULT; @@ -1770,35 +1746,26 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) (void __user *)arg, sizeof(struct qcedev_sha_op_req))) return -EFAULT; - mutex_lock(&hash_access_lock); - if (qcedev_check_sha_params(&qcedev_areq.sha_op_req, podev)) { - mutex_unlock(&hash_access_lock); + if (qcedev_check_sha_params(&qcedev_areq.sha_op_req, podev)) return -EINVAL; - } qcedev_areq.op_type = QCEDEV_CRYPTO_OPER_SHA; qcedev_hash_init(&qcedev_areq, handle, &sg_src); err = qcedev_hash_update(&qcedev_areq, handle, &sg_src); - if (err) { - mutex_unlock(&hash_access_lock); + if (err) return err; - } err = qcedev_hash_final(&qcedev_areq, handle); - if (err) { - mutex_unlock(&hash_access_lock); + if (err) return err; - } if (handle->sha_ctxt.diglen > QCEDEV_MAX_SHA_DIGEST) { pr_err("Invalid sha_ctxt.diglen %d\n", handle->sha_ctxt.diglen); - mutex_unlock(&hash_access_lock); return -EINVAL; } qcedev_areq.sha_op_req.diglen = handle->sha_ctxt.diglen; memcpy(&qcedev_areq.sha_op_req.digest[0], &handle->sha_ctxt.digest[0], handle->sha_ctxt.diglen); - mutex_unlock(&hash_access_lock); if (copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, sizeof(struct qcedev_sha_op_req))) return -EFAULT; -- GitLab