From: Douglas Gilbert Date: Thu, 15 Oct 2020 18:57:35 +0000 (-0400) Subject: sgl_alloc_order: fix memory leak X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=b2a182a40278bc5849730e66bca01a762188ed86;p=linux.git sgl_alloc_order: fix memory leak sgl_alloc_order() can fail when 'length' is large on a memory constrained system. When order > 0 it will potentially be making several multi-page allocations with the later ones more likely to fail than the earlier one. So it is important that sgl_alloc_order() frees up any pages it has obtained before returning NULL. In the case when order > 0 it calls the wrong free page function and leaks. In testing the leak was sufficient to bring down my 8 GiB laptop with OOM. Reviewed-by: Bart Van Assche Signed-off-by: Douglas Gilbert Signed-off-by: Jens Axboe --- diff --git a/lib/scatterlist.c b/lib/scatterlist.c index 5d63a8857f361..c448642e0f786 100644 --- a/lib/scatterlist.c +++ b/lib/scatterlist.c @@ -514,7 +514,7 @@ struct scatterlist *sgl_alloc_order(unsigned long long length, elem_len = min_t(u64, length, PAGE_SIZE << order); page = alloc_pages(gfp, order); if (!page) { - sgl_free(sgl); + sgl_free_order(sgl, order); return NULL; }