Skip to content

Commit 6c3efdc

Browse files
committed
Merge branch 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
Pull crypto fixes from Herbert Xu: "This fixes a bunch of bugs detected by KASAN in the caam driver" * 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6: crypto: caam - fix the address of the last entry of S/G crypto: caam - fix use-after-free KASAN issue for RSA algorithms crypto: caam - fix use-after-free KASAN issue for HASH algorithms crypto: caam - fix use-after-free KASAN issue for AEAD algorithms crypto: caam - fix use-after-free KASAN issue for SKCIPHER algorithms
2 parents 96c9a78 + 55b3209 commit 6c3efdc

File tree

3 files changed

+19
-7
lines changed

3 files changed

+19
-7
lines changed

drivers/crypto/caam/caamalg.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -963,10 +963,12 @@ static void aead_crypt_done(struct device *jrdev, u32 *desc, u32 err,
963963
struct caam_drv_private_jr *jrp = dev_get_drvdata(jrdev);
964964
struct aead_edesc *edesc;
965965
int ecode = 0;
966+
bool has_bklog;
966967

967968
dev_dbg(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
968969

969970
edesc = rctx->edesc;
971+
has_bklog = edesc->bklog;
970972

971973
if (err)
972974
ecode = caam_jr_strstatus(jrdev, err);
@@ -979,7 +981,7 @@ static void aead_crypt_done(struct device *jrdev, u32 *desc, u32 err,
979981
* If no backlog flag, the completion of the request is done
980982
* by CAAM, not crypto engine.
981983
*/
982-
if (!edesc->bklog)
984+
if (!has_bklog)
983985
aead_request_complete(req, ecode);
984986
else
985987
crypto_finalize_aead_request(jrp->engine, req, ecode);
@@ -995,10 +997,12 @@ static void skcipher_crypt_done(struct device *jrdev, u32 *desc, u32 err,
995997
struct caam_drv_private_jr *jrp = dev_get_drvdata(jrdev);
996998
int ivsize = crypto_skcipher_ivsize(skcipher);
997999
int ecode = 0;
1000+
bool has_bklog;
9981001

9991002
dev_dbg(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
10001003

10011004
edesc = rctx->edesc;
1005+
has_bklog = edesc->bklog;
10021006
if (err)
10031007
ecode = caam_jr_strstatus(jrdev, err);
10041008

@@ -1028,7 +1032,7 @@ static void skcipher_crypt_done(struct device *jrdev, u32 *desc, u32 err,
10281032
* If no backlog flag, the completion of the request is done
10291033
* by CAAM, not crypto engine.
10301034
*/
1031-
if (!edesc->bklog)
1035+
if (!has_bklog)
10321036
skcipher_request_complete(req, ecode);
10331037
else
10341038
crypto_finalize_skcipher_request(jrp->engine, req, ecode);
@@ -1711,7 +1715,7 @@ static struct skcipher_edesc *skcipher_edesc_alloc(struct skcipher_request *req,
17111715

17121716
if (ivsize || mapped_dst_nents > 1)
17131717
sg_to_sec4_set_last(edesc->sec4_sg + dst_sg_idx +
1714-
mapped_dst_nents);
1718+
mapped_dst_nents - 1 + !!ivsize);
17151719

17161720
if (sec4_sg_bytes) {
17171721
edesc->sec4_sg_dma = dma_map_single(jrdev, edesc->sec4_sg,

drivers/crypto/caam/caamhash.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -583,10 +583,12 @@ static inline void ahash_done_cpy(struct device *jrdev, u32 *desc, u32 err,
583583
struct caam_hash_state *state = ahash_request_ctx(req);
584584
struct caam_hash_ctx *ctx = crypto_ahash_ctx(ahash);
585585
int ecode = 0;
586+
bool has_bklog;
586587

587588
dev_dbg(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
588589

589590
edesc = state->edesc;
591+
has_bklog = edesc->bklog;
590592

591593
if (err)
592594
ecode = caam_jr_strstatus(jrdev, err);
@@ -603,7 +605,7 @@ static inline void ahash_done_cpy(struct device *jrdev, u32 *desc, u32 err,
603605
* If no backlog flag, the completion of the request is done
604606
* by CAAM, not crypto engine.
605607
*/
606-
if (!edesc->bklog)
608+
if (!has_bklog)
607609
req->base.complete(&req->base, ecode);
608610
else
609611
crypto_finalize_hash_request(jrp->engine, req, ecode);
@@ -632,10 +634,12 @@ static inline void ahash_done_switch(struct device *jrdev, u32 *desc, u32 err,
632634
struct caam_hash_state *state = ahash_request_ctx(req);
633635
int digestsize = crypto_ahash_digestsize(ahash);
634636
int ecode = 0;
637+
bool has_bklog;
635638

636639
dev_dbg(jrdev, "%s %d: err 0x%x\n", __func__, __LINE__, err);
637640

638641
edesc = state->edesc;
642+
has_bklog = edesc->bklog;
639643
if (err)
640644
ecode = caam_jr_strstatus(jrdev, err);
641645

@@ -663,7 +667,7 @@ static inline void ahash_done_switch(struct device *jrdev, u32 *desc, u32 err,
663667
* If no backlog flag, the completion of the request is done
664668
* by CAAM, not crypto engine.
665669
*/
666-
if (!edesc->bklog)
670+
if (!has_bklog)
667671
req->base.complete(&req->base, ecode);
668672
else
669673
crypto_finalize_hash_request(jrp->engine, req, ecode);

drivers/crypto/caam/caampkc.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,11 +121,13 @@ static void rsa_pub_done(struct device *dev, u32 *desc, u32 err, void *context)
121121
struct caam_drv_private_jr *jrp = dev_get_drvdata(dev);
122122
struct rsa_edesc *edesc;
123123
int ecode = 0;
124+
bool has_bklog;
124125

125126
if (err)
126127
ecode = caam_jr_strstatus(dev, err);
127128

128129
edesc = req_ctx->edesc;
130+
has_bklog = edesc->bklog;
129131

130132
rsa_pub_unmap(dev, edesc, req);
131133
rsa_io_unmap(dev, edesc, req);
@@ -135,7 +137,7 @@ static void rsa_pub_done(struct device *dev, u32 *desc, u32 err, void *context)
135137
* If no backlog flag, the completion of the request is done
136138
* by CAAM, not crypto engine.
137139
*/
138-
if (!edesc->bklog)
140+
if (!has_bklog)
139141
akcipher_request_complete(req, ecode);
140142
else
141143
crypto_finalize_akcipher_request(jrp->engine, req, ecode);
@@ -152,11 +154,13 @@ static void rsa_priv_f_done(struct device *dev, u32 *desc, u32 err,
152154
struct caam_rsa_req_ctx *req_ctx = akcipher_request_ctx(req);
153155
struct rsa_edesc *edesc;
154156
int ecode = 0;
157+
bool has_bklog;
155158

156159
if (err)
157160
ecode = caam_jr_strstatus(dev, err);
158161

159162
edesc = req_ctx->edesc;
163+
has_bklog = edesc->bklog;
160164

161165
switch (key->priv_form) {
162166
case FORM1:
@@ -176,7 +180,7 @@ static void rsa_priv_f_done(struct device *dev, u32 *desc, u32 err,
176180
* If no backlog flag, the completion of the request is done
177181
* by CAAM, not crypto engine.
178182
*/
179-
if (!edesc->bklog)
183+
if (!has_bklog)
180184
akcipher_request_complete(req, ecode);
181185
else
182186
crypto_finalize_akcipher_request(jrp->engine, req, ecode);

0 commit comments

Comments
 (0)