On Thu, Feb 10, 2022 at 11:27:34PM +0100, Christophe JAILLET wrote: > The 'err_remove_vmci_dev_g' error label is not at the right place. > This could lead to un-released resource. > > There is also a missing label. If pci_alloc_irq_vectors() fails, the > previous vmci_event_subscribe() call must be undone. > > Signed-off-by: Christophe JAILLET <christophe.jaillet@xxxxxxxxxx> > --- > Review with GREAT care. > > This patch is a recent rebase of an old patch that has never been > submitted. > This function is huge and modifying its error handling path is error > prone (at least for me). > > The patch is compile-tested only. There is still one bug. Sorry if the line numbers are off. drivers/misc/vmw_vmci/vmci_guest.c 705 if (capabilities & VMCI_CAPS_NOTIFICATIONS) { 706 vmci_dev->notification_bitmap = dma_alloc_coherent( ^^^^^ Alloc 707 &pdev->dev, PAGE_SIZE, &vmci_dev->notification_base, 708 GFP_KERNEL); 709 if (!vmci_dev->notification_bitmap) { 710 dev_warn(&pdev->dev, 711 "Unable to allocate notification bitmap\n"); 712 } else { 713 memset(vmci_dev->notification_bitmap, 0, PAGE_SIZE); 714 caps_in_use |= VMCI_CAPS_NOTIFICATIONS; 715 } 716 } 717 718 if (mmio_base != NULL) { 719 if (capabilities & VMCI_CAPS_DMA_DATAGRAM) { 720 caps_in_use |= VMCI_CAPS_DMA_DATAGRAM; 721 } else { 722 dev_err(&pdev->dev, 723 "Missing capability: VMCI_CAPS_DMA_DATAGRAM\n"); 724 error = -ENXIO; 725 goto err_free_data_buffers; This should be goto err_free_notification_bitmap; 726 } 727 } On of the rules for error handling is that the unwind code should mirror the allocation code but instead of that this code will have: Alloc: if (capabilities & VMCI_CAPS_NOTIFICATIONS) Free: if (vmci_dev->notification_bitmap) It's the same if statement but you wouldn't really know it from just looking at it so it's confusing. Whatever... But where this really hurts is with: Alloc: if (vmci_dev->exclusive_vectors) { error = request_irq(pci_irq_vector(pdev, 1), ... Free: free_irq(pci_irq_vector(pdev, 1), vmci_dev); No if statement. It works because it's the last allocation but it's confusing and fragile. The other question I had was: 882 err_remove_bitmap: 883 if (vmci_dev->notification_bitmap) { 884 vmci_write_reg(vmci_dev, VMCI_CONTROL_RESET, VMCI_CONTROL_ADDR); ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This doesn't mirror anything in the allocation code so who knows if its done in the correct place/order. 885 dma_free_coherent(&pdev->dev, PAGE_SIZE, 886 vmci_dev->notification_bitmap, 887 vmci_dev->notification_base); 888 } regards, dan carpenter