[RAMEN9610-8702][COMMON] diskcipher: prevent bug fix
authorbjae3.kim <bjae3.kim@samsung.com>
Wed, 31 Oct 2018 10:56:46 +0000 (19:56 +0900)
committerhskang <hs1218.kang@samsung.com>
Thu, 22 Nov 2018 11:27:01 +0000 (20:27 +0900)
1. kernel/exynos9820/crypto/diskcipher.c (CID 24755)
2. kernel/exynos9820/crypto/diskcipher.c (CID 24851)
3. kernel/exynos9820/crypto/diskcipher.c (CID 25038)

Change-Id: Ia8eac2410418bae3964d4896b45fefca7e4df619
Signed-off-by: bjae3.kim <bjae3.kim@samsung.com>
Signed-off-by: Boojin Kim <boojin.kim@samsung.com>
crypto/diskcipher.c

index a0f11e36a70265ef153b214a80f8744ed863afca..f6205abc277a294b9015f6193b82632ee3a438c6 100644 (file)
@@ -143,8 +143,14 @@ void crypto_diskcipher_check(struct bio *bio)
        int ret = 0;
        struct crypto_diskcipher *ci = NULL;
        struct inode *inode = NULL;
-       struct page *page = bio->bi_io_vec[0].bv_page;
+       struct page *page = NULL;
 
+       if (!bio) {
+               pr_err("%s: doesn't exist bio\n", __func__);
+               goto out;
+       }
+
+       page = bio->bi_io_vec[0].bv_page;
        if (page && !PageAnon(page) && bio)
                if (page->mapping)
                        if (page->mapping->host)
@@ -162,6 +168,7 @@ void crypto_diskcipher_check(struct bio *bio)
                                                crypto_diskcipher_debug(DISKC_CHECK_ERR, 1);
                                        }
                                }
+out:
        crypto_diskcipher_debug(DISKC_API_GET, ret);
 #endif
 }
@@ -204,7 +211,7 @@ int crypto_diskcipher_setkey(struct crypto_diskcipher *tfm, const char *in_key,
        struct diskcipher_alg *cra = crypto_diskcipher_alg(base->__crt_alg);
 
        if (!cra) {
-               pr_err("%s: doesn't exist cra", __func__);
+               pr_err("%s: doesn't exist cra. base:%p", __func__, base);
                return -EINVAL;
        }
 
@@ -218,7 +225,7 @@ int crypto_diskcipher_clearkey(struct crypto_diskcipher *tfm)
        struct diskcipher_alg *cra = crypto_diskcipher_alg(base->__crt_alg);
 
        if (!cra) {
-               pr_err("%s: doesn't exist cra", __func__);
+               pr_err("%s: doesn't exist cra. base:%p", __func__, base);
                return -EINVAL;
        }
        return cra->clearkey(base);
@@ -228,11 +235,19 @@ int crypto_diskcipher_set_crypt(struct crypto_diskcipher *tfm, void *req)
 {
        int ret = 0;
        struct crypto_tfm *base = crypto_diskcipher_tfm(tfm);
-       struct diskcipher_alg *cra = crypto_diskcipher_alg(base->__crt_alg);
+       struct diskcipher_alg *cra = NULL;
+
+       if (!base) {
+               pr_err("%s: doesn't exist cra. base:%p", __func__, base);
+               ret = -EINVAL;
+               goto out;
+       }
+
+       cra = crypto_diskcipher_alg(base->__crt_alg);
 
        if (!cra) {
-               pr_err("%s: doesn't exist cra", __func__);
-               ret = EINVAL;
+               pr_err("%s: doesn't exist cra. base:%p\n", __func__, base);
+               ret = -EINVAL;
                goto out;
        }
 
@@ -263,14 +278,27 @@ int crypto_diskcipher_clear_crypt(struct crypto_diskcipher *tfm, void *req)
 {
        int ret = 0;
        struct crypto_tfm *base = crypto_diskcipher_tfm(tfm);
-       struct diskcipher_alg *cra = crypto_diskcipher_alg(base->__crt_alg);
+       struct diskcipher_alg *cra = NULL;
+
+       if (!base) {
+               pr_err("%s: doesn't exist base, tfm:%p\n", __func__, tfm);
+               ret = -EINVAL;
+               goto out;
+       }
+
+       cra = crypto_diskcipher_alg(base->__crt_alg);
 
        if (!cra) {
-               pr_err("%s: doesn't exist cra", __func__);
-               ret = EINVAL;
+               pr_err("%s: doesn't exist cra. base:%p\n", __func__, base);
+               ret = -EINVAL;
                goto out;
        }
 
+       if (atomic_read(&tfm->status) == DISKC_ST_FREE) {
+               pr_warn("%s: tfm is free\n", __func__);
+               return -EINVAL;
+       }
+
        ret = cra->clear(base, req);
        if (ret)
                pr_err("%s fails", __func__);
@@ -289,8 +317,8 @@ int diskcipher_do_crypt(struct crypto_diskcipher *tfm,
        struct diskcipher_alg *cra = crypto_diskcipher_alg(base->__crt_alg);
 
        if (!cra) {
-               pr_err("%s: doesn't exist cra", __func__);
-               ret = EINVAL;
+               pr_err("%s: doesn't exist cra. base:%p\n", __func__, base);
+               ret = -EINVAL;
                goto out;
        }