lkml.org 
[lkml]   [2020]   [Nov]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.9 180/391] sgl_alloc_order: fix memory leak
    Date
    From: Douglas Gilbert <dgilbert@interlog.com>

    [ Upstream commit b2a182a40278bc5849730e66bca01a762188ed86 ]

    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 <bvanassche@acm.org>
    Signed-off-by: Douglas Gilbert <dgilbert@interlog.com>
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    lib/scatterlist.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    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;
    }

    --
    2.27.0


    \
     
     \ /
      Last update: 2020-11-03 22:55    [W:4.022 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site