[igt-dev] [PATCH i-g-t] lib/igt_device_scan: Assert if there's empty PCI_SLOT_NAME

Zbigniew Kempczyński zbigniew.kempczynski at intel.com
Thu Jul 28 06:59:55 UTC 2022


On one of our testing machines executed i915_pm_rpm at module-reload subtest
catches SIGSEGV with following callstack:

Received signal SIGSEGV.
Stack trace:

There's single suspicious code line in devtype_intel() which might trigger
this behavior - it is strncmp(). But that means pci_slot variable would be
null or point to some garbage. This variable is initialized before from
uevent property so lets verify and assert if there's no PCI_SLOT_NAME
passed from the kernel for pci device. Additionally dump all properties
and attributes to get bigger picture what comes from the kernel to device
scanning library.

Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
Cc: Petri Latvala <petri.latvala at intel.com>
---
 lib/igt_device_scan.c | 31 ++++++++++++++++++++++++-------
 1 file changed, 24 insertions(+), 7 deletions(-)

diff --git a/lib/igt_device_scan.c b/lib/igt_device_scan.c
index aad7966764..d6fae0650c 100644
--- a/lib/igt_device_scan.c
+++ b/lib/igt_device_scan.c
@@ -558,6 +558,16 @@ static void get_attrs(struct udev_device *dev, struct igt_device *idev)
 #define is_drm_subsystem(dev)  (strequal(get_prop_subsystem(dev), "drm"))
 #define is_pci_subsystem(dev)  (strequal(get_prop_subsystem(dev), "pci"))
 
+static void print_ht(GHashTable *ht);
+static void dump_props_and_attrs(const struct igt_device *dev)
+{
+	printf("\n[properties]\n");
+	print_ht(dev->props_ht);
+	printf("\n[attributes]\n");
+	print_ht(dev->attrs_ht);
+	printf("\n");
+}
+
 /*
  * Get PCI_SLOT_NAME property, it should be in format of
  * xxxx:yy:zz.z
@@ -565,9 +575,20 @@ static void get_attrs(struct udev_device *dev, struct igt_device *idev)
 static void set_pci_slot_name(struct igt_device *dev)
 {
 	const char *pci_slot_name = get_prop(dev, "PCI_SLOT_NAME");
+	int len;
+
+	if (!pci_slot_name) {
+		dump_props_and_attrs(dev);
+		igt_assert_f(pci_slot_name, "PCI_SLOT_NAME property == NULL\n");
+	}
+
+	len = strlen(pci_slot_name);
+	if (len != PCI_SLOT_NAME_SIZE) {
+		dump_props_and_attrs(dev);
+		igt_assert_f(len != PCI_SLOT_NAME_SIZE,
+			     "PCI_SLOT_NAME length != %d [%s]\n", len, pci_slot_name);
+	}
 
-	if (!pci_slot_name || (strlen(pci_slot_name) != PCI_SLOT_NAME_SIZE))
-		return;
 	dev->pci_slot_name = strdup(pci_slot_name);
 }
 
@@ -1249,11 +1270,7 @@ igt_devs_print_detail(struct igt_list_head *view,
 			_print_key_value("codename", dev->codename);
 		}
 
-		printf("\n[properties]\n");
-		print_ht(dev->props_ht);
-		printf("\n[attributes]\n");
-		print_ht(dev->attrs_ht);
-		printf("\n");
+		dump_props_and_attrs(dev);
 	}
 }
 
-- 
2.34.1



More information about the igt-dev mailing list