• Ruihan Li's avatar
    usb: usbfs: Enforce page requirements for mmap · 0143d148
    Ruihan Li authored
    The current implementation of usbdev_mmap uses usb_alloc_coherent to
    allocate memory pages that will later be mapped into the user space.
    Meanwhile, usb_alloc_coherent employs three different methods to
    allocate memory, as outlined below:
     * If hcd->localmem_pool is non-null, it uses gen_pool_dma_alloc to
       allocate memory;
     * If DMA is not available, it uses kmalloc to allocate memory;
     * Otherwise, it uses dma_alloc_coherent.
    
    However, it should be noted that gen_pool_dma_alloc does not guarantee
    that the resulting memory will be page-aligned. Furthermore, trying to
    map slab pages (i.e., memory allocated by kmalloc) into the user space
    is not resonable and can lead to problems, such as a type confusion bug
    when PAGE_TABLE_CHECK=y [1].
    
    To address these issues, this patch introduces hcd_alloc_coherent_pages,
    which addresses the above two problems. Specifically,
    hcd_alloc_coherent_pages uses gen_pool_dma_alloc_align instead of
    gen_pool_dma_alloc to ensure that the memory is page-aligned. To replace
    kmalloc, hcd_alloc_coherent_pages directly allocates pages by calling
    __get_free_pages.
    
    Reported-by: syzbot+fcf1a817ceb50935ce99@syzkaller.appspotmail.comm
    Closes: https://lore.kernel.org/lkml/000000000000258e5e05fae79fc1@google.com/ [1]
    Fixes: f7d34b44 ("USB: Add support for usbfs zerocopy.")
    Fixes: ff2437be ("usb: host: Fix excessive alignment restriction for local memory allocations")
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarRuihan Li <lrh2000@pku.edu.cn>
    Acked-by: default avatarAlan Stern <stern@rowland.harvard.edu>
    Link: https://lore.kernel.org/r/20230515130958.32471-2-lrh2000@pku.edu.cnSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    0143d148
buffer.c 4.5 KB