]> mj.ucw.cz Git - pciutils.git/blobdiff - lib/sysfs.c
Sylixos: Bits of Makefile and configure
[pciutils.git] / lib / sysfs.c
index 986ecc93185aec0429961e4c8fedc815855c19f5..577982480fbc87f3c2d51f76307e7fe8123c58e2 100644 (file)
@@ -153,14 +153,17 @@ sysfs_get_resources(struct pci_dev *d)
        size = end - start + 1;
       else
        size = 0;
-      flags &= PCI_ADDR_FLAG_MASK;
       if (i < 6)
        {
+         d->flags[i] = flags;
+         flags &= PCI_ADDR_FLAG_MASK;
          d->base_addr[i] = start | flags;
          d->size[i] = size;
        }
       else
        {
+         d->rom_flags = flags;
+         flags &= PCI_ADDR_FLAG_MASK;
          d->rom_base_addr = start | flags;
          d->rom_size = size;
        }
@@ -193,6 +196,11 @@ static void sysfs_scan(struct pci_access *a)
       d = pci_alloc_dev(a);
       if (sscanf(entry->d_name, "%x:%x:%x.%d", &dom, &bus, &dev, &func) < 4)
        a->error("sysfs_scan: Couldn't parse entry name %s", entry->d_name);
+
+      /* Ensure kernel provided domain that fits in a signed integer */
+      if (dom > 0x7fffffff)
+       a->error("sysfs_scan: Invalid domain %x", dom);
+
       d->domain = dom;
       d->bus = bus;
       d->dev = dev;
@@ -208,7 +216,7 @@ static void sysfs_scan(struct pci_access *a)
          d->vendor_id = sysfs_get_value(d, "vendor", 1);
          d->device_id = sysfs_get_value(d, "device", 1);
          d->device_class = sysfs_get_value(d, "class", 1) >> 8;
-         d->known_fields = PCI_FILL_IDENT | PCI_FILL_CLASS | PCI_FILL_IRQ | PCI_FILL_BASES | PCI_FILL_ROM_BASE | PCI_FILL_SIZES;
+         d->known_fields = PCI_FILL_IDENT | PCI_FILL_CLASS | PCI_FILL_IRQ | PCI_FILL_BASES | PCI_FILL_ROM_BASE | PCI_FILL_SIZES | PCI_FILL_IO_FLAGS;
        }
       pci_link_dev(a, d);
     }
@@ -267,7 +275,7 @@ sysfs_fill_slots(struct pci_access *a)
       else
        {
          for (d = a->devices; d; d = d->next)
-           if (dom == d->domain && bus == d->bus && dev == d->dev && !d->phy_slot)
+           if (dom == (unsigned)d->domain && bus == d->bus && dev == d->dev && !d->phy_slot)
              d->phy_slot = pci_strdup(a, entry->d_name);
        }
       fclose(file);