Commit 24c890dd authored by Herbert Xu's avatar Herbert Xu
Browse files

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: default avatarShigeru Yoshida <syoshida@redhat.com>
Reported-by: default avatarxingwei lee <xrivendell7@gmail.com>
Fixes: b6d972f6 ("crypto: af_alg/hash: Fix recvmsg() after sendmsg(MSG_MORE)")
Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Reported-by: default avatar <syzbot+3266db0c26d1fbbe3abb@syzkaller.appspotmail.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 69fba378
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -91,13 +91,13 @@ static int hash_sendmsg(struct socket *sock, struct msghdr *msg,
		if (!(msg->msg_flags & MSG_MORE)) {
			err = hash_alloc_result(sk, ctx);
			if (err)
				goto unlock_free;
				goto unlock_free_result;
			ahash_request_set_crypt(&ctx->req, NULL,
						ctx->result, 0);
			err = crypto_wait_req(crypto_ahash_final(&ctx->req),
					      &ctx->wait);
			if (err)
				goto unlock_free;
				goto unlock_free_result;
		}
		goto done_more;
	}
@@ -170,6 +170,7 @@ static int hash_sendmsg(struct socket *sock, struct msghdr *msg,

unlock_free:
	af_alg_free_sg(&ctx->sgl);
unlock_free_result:
	hash_free_result(sk, ctx);
	ctx->more = false;
	goto unlock;