diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2009-07-15 21:26:41 +0800 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2009-07-15 21:26:41 +0800 |
commit | cbc86b9161b40f95caee0e56381b68956fc28cc4 (patch) | |
tree | 0170d3692f1bd5aadf07a219641f0658877cbfdd /crypto/shash.c | |
parent | fa64966473830219fe74952029ddb0e981a87749 (diff) | |
download | linux-3.10-cbc86b9161b40f95caee0e56381b68956fc28cc4.tar.gz linux-3.10-cbc86b9161b40f95caee0e56381b68956fc28cc4.tar.bz2 linux-3.10-cbc86b9161b40f95caee0e56381b68956fc28cc4.zip |
crypto: shash - Fix async finup handling of null digest
When shash_ahash_finup encounters a null request, we end up not
calling the underlying final function. This patch fixes that.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto/shash.c')
-rw-r--r-- | crypto/shash.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/crypto/shash.c b/crypto/shash.c index 834d9d24cda..7713b520bc9 100644 --- a/crypto/shash.c +++ b/crypto/shash.c @@ -240,12 +240,17 @@ int shash_ahash_finup(struct ahash_request *req, struct shash_desc *desc) struct crypto_hash_walk walk; int nbytes; - for (nbytes = crypto_hash_walk_first(req, &walk); nbytes > 0; - nbytes = crypto_hash_walk_done(&walk, nbytes)) + nbytes = crypto_hash_walk_first(req, &walk); + if (!nbytes) + return crypto_shash_final(desc, req->result); + + do { nbytes = crypto_hash_walk_last(&walk) ? crypto_shash_finup(desc, walk.data, nbytes, req->result) : crypto_shash_update(desc, walk.data, nbytes); + nbytes = crypto_hash_walk_done(&walk, nbytes); + } while (nbytes > 0); return nbytes; } |