Skip to content

Commit 108ce62

Browse files
committed
crypto: hash - Fix synchronous ahash chaining fallback
The synchronous ahash fallback code paths are broken because the ahash_restore_req assumes there is always a state object. Fix this by removing the state from ahash_restore_req and localising it to the asynchronous completion callback. Also add a missing synchronous finish call in ahash_def_digest_finish. Fixes: f2ffe5a ("crypto: hash - Add request chaining API") Fixes: 439963c ("crypto: ahash - Add virtual address support") Signed-off-by: Herbert Xu <[email protected]>
1 parent 3846c01 commit 108ce62

File tree

1 file changed

+28
-32
lines changed

1 file changed

+28
-32
lines changed

crypto/ahash.c

Lines changed: 28 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,9 @@ struct ahash_save_req_state {
5858

5959
static void ahash_reqchain_done(void *data, int err);
6060
static int ahash_save_req(struct ahash_request *req, crypto_completion_t cplt);
61-
static void ahash_restore_req(struct ahash_save_req_state *state);
61+
static void ahash_restore_req(struct ahash_request *req);
6262
static void ahash_def_finup_done1(void *data, int err);
63+
static int ahash_def_finup_finish1(struct ahash_request *req, int err);
6364
static int ahash_def_finup(struct ahash_request *req);
6465

6566
static int hash_walk_next(struct crypto_hash_walk *walk)
@@ -369,14 +370,15 @@ static int ahash_reqchain_virt(struct ahash_save_req_state *state,
369370
return err;
370371
}
371372

372-
static int ahash_reqchain_finish(struct ahash_save_req_state *state,
373+
static int ahash_reqchain_finish(struct ahash_request *req0,
374+
struct ahash_save_req_state *state,
373375
int err, u32 mask)
374376
{
375-
struct ahash_request *req0 = state->req0;
376377
struct ahash_request *req = state->cur;
377378
struct crypto_ahash *tfm;
378379
struct ahash_request *n;
379380
bool update;
381+
u8 *page;
380382

381383
err = ahash_reqchain_virt(state, err, mask);
382384
if (err == -EINPROGRESS || err == -EBUSY)
@@ -430,7 +432,12 @@ static int ahash_reqchain_finish(struct ahash_save_req_state *state,
430432
list_add_tail(&req->base.list, &req0->base.list);
431433
}
432434

433-
ahash_restore_req(state);
435+
page = state->page;
436+
if (page) {
437+
memset(page, 0, PAGE_SIZE);
438+
free_page((unsigned long)page);
439+
}
440+
ahash_restore_req(req0);
434441

435442
out:
436443
return err;
@@ -449,7 +456,8 @@ static void ahash_reqchain_done(void *data, int err)
449456
goto notify;
450457
}
451458

452-
err = ahash_reqchain_finish(state, err, CRYPTO_TFM_REQ_MAY_BACKLOG);
459+
err = ahash_reqchain_finish(state->req0, state, err,
460+
CRYPTO_TFM_REQ_MAY_BACKLOG);
453461
if (err == -EBUSY)
454462
return;
455463

@@ -525,13 +533,10 @@ static int ahash_do_req_chain(struct ahash_request *req,
525533
if (err == -EBUSY || err == -EINPROGRESS)
526534
return -EBUSY;
527535

528-
return ahash_reqchain_finish(state, err, ~0);
536+
return ahash_reqchain_finish(req, state, err, ~0);
529537

530538
out_free_page:
531-
if (page) {
532-
memset(page, 0, PAGE_SIZE);
533-
free_page((unsigned long)page);
534-
}
539+
free_page((unsigned long)page);
535540

536541
out_set_chain:
537542
req->base.err = err;
@@ -590,18 +595,15 @@ static int ahash_save_req(struct ahash_request *req, crypto_completion_t cplt)
590595
req->base.complete = cplt;
591596
req->base.data = state;
592597
state->req0 = req;
593-
state->page = NULL;
594598

595599
return 0;
596600
}
597601

598-
static void ahash_restore_req(struct ahash_save_req_state *state)
602+
static void ahash_restore_req(struct ahash_request *req)
599603
{
600-
struct ahash_request *req = state->req0;
604+
struct ahash_save_req_state *state;
601605
struct crypto_ahash *tfm;
602606

603-
free_page((unsigned long)state->page);
604-
605607
tfm = crypto_ahash_reqtfm(req);
606608
if (!ahash_is_async(tfm))
607609
return;
@@ -692,9 +694,8 @@ int crypto_ahash_finup(struct ahash_request *req)
692694
}
693695
EXPORT_SYMBOL_GPL(crypto_ahash_finup);
694696

695-
static int ahash_def_digest_finish(struct ahash_save_req_state *state, int err)
697+
static int ahash_def_digest_finish(struct ahash_request *req, int err)
696698
{
697-
struct ahash_request *req = state->req0;
698699
struct crypto_ahash *tfm;
699700

700701
if (err)
@@ -708,8 +709,10 @@ static int ahash_def_digest_finish(struct ahash_save_req_state *state, int err)
708709
if (err == -EINPROGRESS || err == -EBUSY)
709710
return err;
710711

712+
return ahash_def_finup_finish1(req, err);
713+
711714
out:
712-
ahash_restore_req(state);
715+
ahash_restore_req(req);
713716
return err;
714717
}
715718

@@ -726,7 +729,7 @@ static void ahash_def_digest_done(void *data, int err)
726729

727730
areq->base.flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
728731

729-
err = ahash_def_digest_finish(state0, err);
732+
err = ahash_def_digest_finish(areq, err);
730733
if (err == -EINPROGRESS || err == -EBUSY)
731734
return;
732735

@@ -736,20 +739,17 @@ static void ahash_def_digest_done(void *data, int err)
736739

737740
static int ahash_def_digest(struct ahash_request *req)
738741
{
739-
struct ahash_save_req_state *state;
740742
int err;
741743

742744
err = ahash_save_req(req, ahash_def_digest_done);
743745
if (err)
744746
return err;
745747

746-
state = req->base.data;
747-
748748
err = crypto_ahash_init(req);
749749
if (err == -EINPROGRESS || err == -EBUSY)
750750
return err;
751751

752-
return ahash_def_digest_finish(state, err);
752+
return ahash_def_digest_finish(req, err);
753753
}
754754

755755
int crypto_ahash_digest(struct ahash_request *req)
@@ -791,13 +791,12 @@ static void ahash_def_finup_done2(void *data, int err)
791791
if (err == -EINPROGRESS)
792792
return;
793793

794-
ahash_restore_req(state);
794+
ahash_restore_req(areq);
795795
ahash_request_complete(areq, err);
796796
}
797797

798-
static int ahash_def_finup_finish1(struct ahash_save_req_state *state, int err)
798+
static int ahash_def_finup_finish1(struct ahash_request *req, int err)
799799
{
800-
struct ahash_request *req = state->req0;
801800
struct crypto_ahash *tfm;
802801

803802
if (err)
@@ -812,7 +811,7 @@ static int ahash_def_finup_finish1(struct ahash_save_req_state *state, int err)
812811
return err;
813812

814813
out:
815-
ahash_restore_req(state);
814+
ahash_restore_req(req);
816815
return err;
817816
}
818817

@@ -829,7 +828,7 @@ static void ahash_def_finup_done1(void *data, int err)
829828

830829
areq->base.flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP;
831830

832-
err = ahash_def_finup_finish1(state0, err);
831+
err = ahash_def_finup_finish1(areq, err);
833832
if (err == -EINPROGRESS || err == -EBUSY)
834833
return;
835834

@@ -839,20 +838,17 @@ static void ahash_def_finup_done1(void *data, int err)
839838

840839
static int ahash_def_finup(struct ahash_request *req)
841840
{
842-
struct ahash_save_req_state *state;
843841
int err;
844842

845843
err = ahash_save_req(req, ahash_def_finup_done1);
846844
if (err)
847845
return err;
848846

849-
state = req->base.data;
850-
851847
err = crypto_ahash_update(req);
852848
if (err == -EINPROGRESS || err == -EBUSY)
853849
return err;
854850

855-
return ahash_def_finup_finish1(state, err);
851+
return ahash_def_finup_finish1(req, err);
856852
}
857853

858854
int crypto_ahash_export(struct ahash_request *req, void *out)

0 commit comments

Comments
 (0)