crypto: algif_hash - Remove bogus SGL free on zero-length error path
When a zero-length message is hashed by algif_hash, and an error
is triggered, it tries to free an SG list that was never allocated
in the first place. Fix this by not freeing the SG list on the
zero-length error path.
Reported-by: Shigeru Yoshida <syoshida@redhat.com>
Reported-by: xingwei lee <xrivendell7@gmail.com>
Fixes: b6d972f689
("crypto: af_alg/hash: Fix recvmsg() after sendmsg(MSG_MORE)")
Cc: <stable@vger.kernel.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Reported-by: syzbot+3266db0c26d1fbbe3abb@syzkaller.appspotmail.com
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
69fba378ed
commit
24c890dd71
@ -91,13 +91,13 @@ static int hash_sendmsg(struct socket *sock, struct msghdr *msg,
|
|||||||
if (!(msg->msg_flags & MSG_MORE)) {
|
if (!(msg->msg_flags & MSG_MORE)) {
|
||||||
err = hash_alloc_result(sk, ctx);
|
err = hash_alloc_result(sk, ctx);
|
||||||
if (err)
|
if (err)
|
||||||
goto unlock_free;
|
goto unlock_free_result;
|
||||||
ahash_request_set_crypt(&ctx->req, NULL,
|
ahash_request_set_crypt(&ctx->req, NULL,
|
||||||
ctx->result, 0);
|
ctx->result, 0);
|
||||||
err = crypto_wait_req(crypto_ahash_final(&ctx->req),
|
err = crypto_wait_req(crypto_ahash_final(&ctx->req),
|
||||||
&ctx->wait);
|
&ctx->wait);
|
||||||
if (err)
|
if (err)
|
||||||
goto unlock_free;
|
goto unlock_free_result;
|
||||||
}
|
}
|
||||||
goto done_more;
|
goto done_more;
|
||||||
}
|
}
|
||||||
@ -170,6 +170,7 @@ unlock:
|
|||||||
|
|
||||||
unlock_free:
|
unlock_free:
|
||||||
af_alg_free_sg(&ctx->sgl);
|
af_alg_free_sg(&ctx->sgl);
|
||||||
|
unlock_free_result:
|
||||||
hash_free_result(sk, ctx);
|
hash_free_result(sk, ctx);
|
||||||
ctx->more = false;
|
ctx->more = false;
|
||||||
goto unlock;
|
goto unlock;
|
||||||
|
Loading…
Reference in New Issue
Block a user