]> xenbits.xensource.com Git - qemu-xen-4.0-testing.git/commitdiff
fix memory/fd leak in pt_msix_init()
authorIan Jackson <ian.jackson@eu.citrix.com>
Mon, 9 Feb 2009 10:40:12 +0000 (10:40 +0000)
committerIan Jackson <Ian.Jackson@eu.citrix.com>
Mon, 9 Feb 2009 10:40:12 +0000 (10:40 +0000)
Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
hw/pass-through.h
hw/pt-msi.c

index 4704d83a1af47d45ba959d47d996d777e67b58a7..b44b9d704773a0e3aabdf53870729403079486dd 100644 (file)
@@ -165,7 +165,6 @@ struct pt_msix_info {
     uint32_t table_off;
     uint64_t mmio_base_addr;
     int mmio_index;
-    int fd;
     void *phys_iomem_base;
     struct msix_entry_info msix_entry[0];
 };
index c7a8f22f8a45d710068039562895d6c6f7578db9..bdd1b38b3c725caf3e0cb10f640e3630e0fb07b7 100644 (file)
@@ -498,6 +498,7 @@ int pt_msix_init(struct pt_dev *dev, int pos)
     uint16_t control;
     int i, total_entries, table_off, bar_index;
     struct pci_dev *pd = dev->pci_dev;
+    int fd;
 
     id = pci_read_byte(pd, pos + PCI_CAP_LIST_ID);
 
@@ -534,19 +535,31 @@ int pt_msix_init(struct pt_dev *dev, int pos)
     PT_LOG("get MSI-X table bar base %llx\n",
            (unsigned long long)dev->msix->table_base);
 
-    dev->msix->fd = open("/dev/mem", O_RDWR);
+    fd = open("/dev/mem", O_RDWR);
+    if ( fd == -1 )
+    {
+        PT_LOG("Can't open /dev/mem: %s\n", strerror(errno));
+        goto error_out;
+    }
     dev->msix->phys_iomem_base = mmap(0, total_entries * 16,
                           PROT_WRITE | PROT_READ, MAP_SHARED | MAP_LOCKED,
-                          dev->msix->fd, dev->msix->table_base + table_off);
+                          fd, dev->msix->table_base + table_off);
     if ( dev->msix->phys_iomem_base == MAP_FAILED )
     {
         PT_LOG("Can't map physical MSI-X table: %s\n", strerror(errno));
-        return -1;
+        close(fd);
+        goto error_out;
     }
+    close(fd);
 
     PT_LOG("mapping physical MSI-X table to %lx\n",
            (unsigned long)dev->msix->phys_iomem_base);
     return 0;
+
+error_out:
+    free(dev->msix);
+    dev->msix = NULL;
+    return -1;
 }
 
 void pt_msix_delete(struct pt_dev *dev)