• Wang Hai's avatar
    VMCI: fix NULL pointer dereference when unmapping queue pair · a30dc6cf
    Wang Hai authored
    I got a NULL pointer dereference report when doing fuzz test:
    
    Call Trace:
      qp_release_pages+0xae/0x130
      qp_host_unregister_user_memory.isra.25+0x2d/0x80
      vmci_qp_broker_unmap+0x191/0x320
      ? vmci_host_do_alloc_queuepair.isra.9+0x1c0/0x1c0
      vmci_host_unlocked_ioctl+0x59f/0xd50
      ? do_vfs_ioctl+0x14b/0xa10
      ? tomoyo_file_ioctl+0x28/0x30
      ? vmci_host_do_alloc_queuepair.isra.9+0x1c0/0x1c0
      __x64_sys_ioctl+0xea/0x120
      do_syscall_64+0x34/0xb0
      entry_SYSCALL_64_after_hwframe+0x44/0xae
    
    When a queue pair is created by the following call, it will not
    register the user memory if the page_store is NULL, and the
    entry->state will be set to VMCIQPB_CREATED_NO_MEM.
    
    vmci_host_unlocked_ioctl
      vmci_host_do_alloc_queuepair
        vmci_qp_broker_alloc
          qp_broker_alloc
            qp_broker_create // set entry->state = VMCIQPB_CREATED_NO_MEM;
    
    When unmapping this queue pair, qp_host_unregister_user_memory() will
    be called to unregister the non-existent user memory, which will
    result in a null pointer reference. It will also change
    VMCIQPB_CREATED_NO_MEM to VMCIQPB_CREATED_MEM, which should not be
    present in this operation.
    
    Only when the qp broker has mem, it can unregister the user
    memory when unmapping the qp broker.
    
    Only when the qp broker has no mem, it can register the user
    memory when mapping the qp broker.
    
    Fixes: 06164d2b ("VMCI: queue pairs implementation.")
    Cc: stable <stable@vger.kernel.org>
    Reported-by: default avatarHulk Robot <hulkci@huawei.com>
    Reviewed-by: default avatarJorgen Hansen <jhansen@vmware.com>
    Signed-off-by: default avatarWang Hai <wanghai38@huawei.com>
    Link: https://lore.kernel.org/r/20210818124845.488312-1-wanghai38@huawei.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    a30dc6cf
vmci_queue_pair.c 92.8 KB