Commit d9582749 authored by Stephan Mueller's avatar Stephan Mueller Committed by Greg Kroah-Hartman

crypto: algif_skcipher - only call put_page on referenced and used pages

commit 445a5827 upstream.

For asynchronous operation, SGs are allocated without a page mapped to
them or with a page that is not used (ref-counted). If the SGL is freed,
the code must only call put_page for an SG if there was a page assigned
and ref-counted in the first place.

This fixes a kernel crash when using io_submit with more than one iocb
using the sendmsg and sendpage (vmsplice/splice) interface.
Signed-off-by: default avatarStephan Mueller <smueller@chronox.de>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent ab3ee6b5
...@@ -86,8 +86,13 @@ static void skcipher_free_async_sgls(struct skcipher_async_req *sreq) ...@@ -86,8 +86,13 @@ static void skcipher_free_async_sgls(struct skcipher_async_req *sreq)
} }
sgl = sreq->tsg; sgl = sreq->tsg;
n = sg_nents(sgl); n = sg_nents(sgl);
for_each_sg(sgl, sg, n, i) for_each_sg(sgl, sg, n, i) {
put_page(sg_page(sg)); struct page *page = sg_page(sg);
/* some SGs may not have a page mapped */
if (page && atomic_read(&page->_count))
put_page(page);
}
kfree(sreq->tsg); kfree(sreq->tsg);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment