• Wenwen Wang's avatar
    misc: mic: fix a DMA pool free failure · 15b3048a
    Wenwen Wang authored
    In _scif_prog_signal(), a DMA pool is allocated if the MIC Coprocessor is
    not X100, i.e., the boolean variable 'x100' is false. This DMA pool will be
    freed eventually through the callback function scif_prog_signal_cb() with
    the parameter of 'status', which actually points to the start of DMA pool.
    Specifically, in scif_prog_signal_cb(), the 'ep' field and the
    'src_dma_addr' field of 'status' are used to free the DMA pool by invoking
    dma_pool_free(). Given that 'status' points to the start address of the DMA
    pool, both 'status->ep' and 'status->src_dma_addr' are in the DMA pool. And
    so, the device has the permission to access them. Even worse, a malicious
    device can modify them. As a result, dma_pool_free() will not succeed.
    
    To avoid the above issue, this patch introduces a new data structure, i.e.,
    scif_cb_arg, to store the arguments required by the call back function. A
    variable 'cb_arg' is allocated in _scif_prog_signal() to pass the
    arguments. 'cb_arg' will be freed after dma_pool_free() in
    scif_prog_signal_cb().
    Signed-off-by: default avatarWenwen Wang <wang6495@umn.edu>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    15b3048a
scif_rma.h 15.9 KB