• Marek Vasut's avatar
    crypto: hash - Simplify the ahash_finup implementation · d4a7a0fb
    Marek Vasut authored
    The ahash_def_finup() can make use of the request save/restore functions,
    thus make it so. This simplifies the code a little and unifies the code
    paths.
    
    Note that the same remark about free()ing the req->priv applies here, the
    req->priv can only be free()'d after the original request was restored.
    
    Finally, squash a bug in the invocation of completion in the ASYNC path.
    In both ahash_def_finup_done{1,2}, the function areq->base.complete(X, err);
    was called with X=areq->base.data . This is incorrect , as X=&areq->base
    is the correct value. By analysis of the data structures, we see the areq is
    of type 'struct ahash_request' , areq->base is of type 'struct crypto_async_request'
    and areq->base.completion is of type crypto_completion_t, which is defined in
    include/linux/crypto.h as:
    
      typedef void (*crypto_completion_t)(struct crypto_async_request *req, int err);
    
    This is one lead that the X should be &areq->base . Next up, we can inspect
    other code which calls the completion callback to give us kind-of statistical
    idea of how this callback is used. We can try:
    
      $ git grep base\.complete\( drivers/crypto/
    
    Finally, by inspecting ahash_request_set_callback() implementation defined
    in include/crypto/hash.h , we observe that the .data entry of 'struct
    crypto_async_request' is intended for arbitrary data, not for completion
    argument.
    Signed-off-by: default avatarMarek Vasut <marex@denx.de>
    Cc: David S. Miller <davem@davemloft.net>
    Cc: Fabio Estevam <fabio.estevam@freescale.com>
    Cc: Herbert Xu <herbert@gondor.apana.org.au>
    Cc: Shawn Guo <shawn.guo@linaro.org>
    Cc: Tom Lendacky <thomas.lendacky@amd.com>
    Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
    d4a7a0fb
ahash.c 13.9 KB