bus/pci: fix Intel IOMMU sysfs access check
authorStephen Hemminger <stephen@networkplumber.org>
Tue, 13 Aug 2019 15:38:22 +0000 (08:38 -0700)
committerDavid Marchand <david.marchand@redhat.com>
Wed, 9 Oct 2019 08:22:45 +0000 (10:22 +0200)
Just open the sysfs file and handle failure, rather than using access().
This eliminates Coverity warnings about TOCTOU
"time of check versus time of use"; although for this sysfs file that is
not really an issue anyway.

Coverity issue: 347276
Fixes: 54a328f552ff ("bus/pci: forbid IOVA mode if IOMMU address width too small")
Cc: stable@dpdk.org
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
Reviewed-by: David Marchand <david.marchand@redhat.com>
drivers/bus/pci/linux/pci.c

index 1ac2bff..318db19 100644 (file)
@@ -511,18 +511,19 @@ pci_device_iommu_support_va(const struct rte_pci_device *dev)
                 "%s/" PCI_PRI_FMT "/iommu/intel-iommu/cap",
                 rte_pci_get_sysfs_path(), addr->domain, addr->bus, addr->devid,
                 addr->function);
-       if (access(filename, F_OK) == -1) {
-               /* We don't have an Intel IOMMU, assume VA supported*/
-               return true;
-       }
 
-       /* We have an intel IOMMU */
        fp = fopen(filename, "r");
        if (fp == NULL) {
-               RTE_LOG(ERR, EAL, "%s(): can't open %s\n", __func__, filename);
+               /* We don't have an Intel IOMMU, assume VA supported */
+               if (errno == ENOENT)
+                       return true;
+
+               RTE_LOG(ERR, EAL, "%s(): can't open %s: %s\n",
+                       __func__, filename, strerror(errno));
                return false;
        }
 
+       /* We have an Intel IOMMU */
        if (fscanf(fp, "%" PRIx64, &vtd_cap_reg) != 1) {
                RTE_LOG(ERR, EAL, "%s(): can't read %s\n", __func__, filename);
                fclose(fp);