| From: Herbert Xu <herbert@gondor.apana.org.au> |
| Date: Mon, 26 Mar 2018 08:53:25 +0800 |
| Subject: crypto: ahash - Fix early termination in hash walk |
| |
| commit 900a081f6912a8985dc15380ec912752cb66025a upstream. |
| |
| When we have an unaligned SG list entry where there is no leftover |
| aligned data, the hash walk code will incorrectly return zero as if |
| the entire SG list has been processed. |
| |
| This patch fixes it by moving onto the next page instead. |
| |
| Reported-by: Eli Cooper <elicooper@gmx.com> |
| Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| crypto/ahash.c | 7 ++++--- |
| 1 file changed, 4 insertions(+), 3 deletions(-) |
| |
| --- a/crypto/ahash.c |
| +++ b/crypto/ahash.c |
| @@ -90,13 +90,14 @@ int crypto_hash_walk_done(struct crypto_ |
| |
| if (nbytes && walk->offset & alignmask && !err) { |
| walk->offset = ALIGN(walk->offset, alignmask + 1); |
| - walk->data += walk->offset; |
| - |
| nbytes = min(nbytes, |
| ((unsigned int)(PAGE_SIZE)) - walk->offset); |
| walk->entrylen -= nbytes; |
| |
| - return nbytes; |
| + if (nbytes) { |
| + walk->data += walk->offset; |
| + return nbytes; |
| + } |
| } |
| |
| if (walk->flags & CRYPTO_ALG_ASYNC) |