From 9b28c5aea3a37dc6382a61fb65c97a9db6eeeac0 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Thu, 15 Nov 2018 17:48:53 -0800 Subject: [PATCH] Avoid hardcoded strlens in drmParseSubsystemType(). Having people count characters is error-prone, when we could just have a computer do it. Reviewed-by: Eric Engestrom --- xf86drm.c | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/xf86drm.c b/xf86drm.c index 10df682b..60fbc49b 100644 --- a/xf86drm.c +++ b/xf86drm.c @@ -59,6 +59,8 @@ #endif #include +#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) + /* Not all systems have MAP_FAILED defined */ #ifndef MAP_FAILED #define MAP_FAILED ((void *)-1) @@ -2984,6 +2986,16 @@ static int drmParseSubsystemType(int maj, int min) char path[PATH_MAX + 1]; char link[PATH_MAX + 1] = ""; char *name; + struct { + const char *name; + int bus_type; + } bus_types[] = { + { "/pci", DRM_BUS_PCI }, + { "/usb", DRM_BUS_USB }, + { "/platform", DRM_BUS_PLATFORM }, + { "/host1x", DRM_BUS_HOST1X }, + { "/virtio", DRM_BUS_VIRTIO }, + }; snprintf(path, PATH_MAX, "/sys/dev/char/%d:%d/device/subsystem", maj, min); @@ -2995,20 +3007,10 @@ static int drmParseSubsystemType(int maj, int min) if (!name) return -EINVAL; - if (strncmp(name, "/pci", 4) == 0) - return DRM_BUS_PCI; - - if (strncmp(name, "/usb", 4) == 0) - return DRM_BUS_USB; - - if (strncmp(name, "/platform", 9) == 0) - return DRM_BUS_PLATFORM; - - if (strncmp(name, "/host1x", 7) == 0) - return DRM_BUS_HOST1X; - - if (strncmp(name, "/virtio", 7) == 0) - return DRM_BUS_VIRTIO; + for (unsigned i = 0; i < ARRAY_SIZE(bus_types); i++) { + if (strncmp(name, bus_types[i].name, strlen(bus_types[i].name)) == 0) + return bus_types[i].bus_type; + } return -EINVAL; #elif defined(__OpenBSD__) @@ -3149,7 +3151,6 @@ static int parse_separate_sysfs_files(int maj, int min, drmPciDeviceInfoPtr device, bool ignore_revision) { -#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) static const char *attrs[] = { "revision", /* Older kernels are missing the file, so check for it first */ "vendor",