crypto: shash - Fix async finup handling of null digest
authorHerbert Xu <herbert@gondor.apana.org.au>
Wed, 15 Jul 2009 13:26:41 +0000 (21:26 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Wed, 15 Jul 2009 13:26:41 +0000 (21:26 +0800)
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>
crypto/shash.c

index 834d9d24cdae9cbfa90b1d566a59b1cc49077b65..7713b520bc9854645b369da102d60f5839939387 100644 (file)
@@ -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;
 }