• L
    cifs: Allocate validate negotiation request through kmalloc · 2796d303
    Long Li 提交于
    The data buffer allocated on the stack can't be DMA'ed, ib_dma_map_page will
    return an invalid DMA address for a buffer on stack. Even worse, this
    incorrect address can't be detected by ib_dma_mapping_error. Sending data
    from this address to hardware will not fail, but the remote peer will get
    junk data.
    
    Fix this by allocating the request on the heap in smb3_validate_negotiate.
    
    Changes in v2:
    Removed duplicated code on freeing buffers on function exit.
    (Thanks to Parav Pandit <parav@mellanox.com>)
    Fixed typo in the patch title.
    
    Changes in v3:
    Added "Fixes" to the patch.
    Changed several sizeof() to use *pointer in place of struct.
    
    Changes in v4:
    Added detailed comments on the failure through RDMA.
    Allocate request buffer using GPF_NOFS.
    Fixed possible memory leak.
    
    Changes in v5:
    Removed variable ret for checking return value.
    Changed to use pneg_inbuf->Dialects[0] to calculate unused space in pneg_inbuf.
    
    Fixes: ff1c038a ("Check SMB3 dialects against downgrade attacks")
    Signed-off-by: NLong Li <longli@microsoft.com>
    Signed-off-by: NSteve French <stfrench@microsoft.com>
    Reviewed-by: NRonnie Sahlberg <lsahlber@redhat.com>
    Reviewed-by: NTom Talpey <ttalpey@microsoft.com>
    2796d303
smb2pdu.c 104.5 KB