lkml.org 
[lkml]   [2019]   [Jun]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH v18 12/15] media/v4l2-core: untag user pointers in videobuf_dma_contig_user_get
    From
    This patch is a part of a series that extends kernel ABI to allow to pass
    tagged user pointers (with the top byte set to something else other than
    0x00) as syscall arguments.

    videobuf_dma_contig_user_get() uses provided user pointers for vma
    lookups, which can only by done with untagged pointers.

    Untag the pointers in this function.

    Reviewed-by: Khalid Aziz <khalid.aziz@oracle.com>
    Reviewed-by: Kees Cook <keescook@chromium.org>
    Acked-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
    Signed-off-by: Andrey Konovalov <andreyknvl@google.com>
    ---
    drivers/media/v4l2-core/videobuf-dma-contig.c | 9 +++++----
    1 file changed, 5 insertions(+), 4 deletions(-)

    diff --git a/drivers/media/v4l2-core/videobuf-dma-contig.c b/drivers/media/v4l2-core/videobuf-dma-contig.c
    index 0491122b03c4..ec554eff29b9 100644
    --- a/drivers/media/v4l2-core/videobuf-dma-contig.c
    +++ b/drivers/media/v4l2-core/videobuf-dma-contig.c
    @@ -157,6 +157,7 @@ static void videobuf_dma_contig_user_put(struct videobuf_dma_contig_memory *mem)
    static int videobuf_dma_contig_user_get(struct videobuf_dma_contig_memory *mem,
    struct videobuf_buffer *vb)
    {
    + unsigned long untagged_baddr = untagged_addr(vb->baddr);
    struct mm_struct *mm = current->mm;
    struct vm_area_struct *vma;
    unsigned long prev_pfn, this_pfn;
    @@ -164,22 +165,22 @@ static int videobuf_dma_contig_user_get(struct videobuf_dma_contig_memory *mem,
    unsigned int offset;
    int ret;

    - offset = vb->baddr & ~PAGE_MASK;
    + offset = untagged_baddr & ~PAGE_MASK;
    mem->size = PAGE_ALIGN(vb->size + offset);
    ret = -EINVAL;

    down_read(&mm->mmap_sem);

    - vma = find_vma(mm, vb->baddr);
    + vma = find_vma(mm, untagged_baddr);
    if (!vma)
    goto out_up;

    - if ((vb->baddr + mem->size) > vma->vm_end)
    + if ((untagged_baddr + mem->size) > vma->vm_end)
    goto out_up;

    pages_done = 0;
    prev_pfn = 0; /* kill warning */
    - user_address = vb->baddr;
    + user_address = untagged_baddr;

    while (pages_done < (mem->size >> PAGE_SHIFT)) {
    ret = follow_pfn(vma, user_address, &this_pfn);
    --
    2.22.0.410.gd8fdbe21b5-goog
    \
     
     \ /
      Last update: 2019-06-24 16:34    [W:3.863 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site