lkml.org 
[lkml]   [2021]   [Oct]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v8 01/17] iov_iter: Fix iov_iter_get_pages{,_alloc} page fault return value
    Date
    Both iov_iter_get_pages and iov_iter_get_pages_alloc return the number
    of bytes of the iovec they could get the pages for. When they cannot
    get any pages, they're supposed to return 0, but when the start of the
    iovec isn't page aligned, the calculation goes wrong and they return a
    negative value. Fix both functions.

    In addition, change iov_iter_get_pages_alloc to return NULL in that case
    to prevent resource leaks.

    Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    ---
    lib/iov_iter.c | 5 +++--
    1 file changed, 3 insertions(+), 2 deletions(-)

    diff --git a/lib/iov_iter.c b/lib/iov_iter.c
    index 755c10c5138c..60b5e6edfbaa 100644
    --- a/lib/iov_iter.c
    +++ b/lib/iov_iter.c
    @@ -1488,7 +1488,7 @@ ssize_t iov_iter_get_pages(struct iov_iter *i,
    res = get_user_pages_fast(addr, n,
    iov_iter_rw(i) != WRITE ? FOLL_WRITE : 0,
    pages);
    - if (unlikely(res < 0))
    + if (unlikely(res <= 0))
    return res;
    return (res == n ? len : res * PAGE_SIZE) - *start;
    }
    @@ -1612,8 +1612,9 @@ ssize_t iov_iter_get_pages_alloc(struct iov_iter *i,
    return -ENOMEM;
    res = get_user_pages_fast(addr, n,
    iov_iter_rw(i) != WRITE ? FOLL_WRITE : 0, p);
    - if (unlikely(res < 0)) {
    + if (unlikely(res <= 0)) {
    kvfree(p);
    + *pages = NULL;
    return res;
    }
    *pages = p;
    --
    2.26.3
    \
     
     \ /
      Last update: 2021-10-19 15:42    [W:8.905 / U:0.272 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site