return strdup(name);
#else
struct stat sbuf;
- char buf[PATH_MAX + 1];
+ char *buf = NULL;
+ int len = 0;
const char *dev_name = drmGetDeviceName(type);
unsigned int maj, min;
int n;
if (!dev_name)
return NULL;
- n = snprintf(buf, sizeof(buf), dev_name, DRM_DIR_NAME, min);
- if (n == -1 || n >= sizeof(buf))
+ len = snprintf(NULL, 0, dev_name, DRM_DIR_NAME, min);
+ if (len < 0)
return NULL;
+ len++;
+ buf = malloc(len);
+ n = snprintf(buf, len, dev_name, DRM_DIR_NAME, min);
+ if (n == -1 || n >= len) {
+ free(buf);
+ return NULL;
+ }
- return strdup(buf);
+ return buf;
#endif
}
bool fetch_deviceinfo, uint32_t flags)
{
struct stat sbuf;
- char node[PATH_MAX + 1];
+ char *node = NULL;
int node_type, subsystem_type;
+ int len = 0, n, ret = 0;
unsigned int maj, min;
node_type = drmGetNodeType(d_name);
if (node_type < 0)
return -1;
- snprintf(node, PATH_MAX, "%s/%s", DRM_DIR_NAME, d_name);
- if (stat(node, &sbuf))
+ len = snprintf(NULL, 0, "%s/%s", DRM_DIR_NAME, d_name);
+ if (len < 0)
+ return -1;
+ len++;
+ node = malloc(len);
+ n = snprintf(node, len, "%s/%s", DRM_DIR_NAME, d_name);
+ if (n == -1 || n >= len) {
+ free(node);
return -1;
+ }
+
+ if (stat(node, &sbuf)) {
+ free(node);
+ return -1;
+ }
maj = major(sbuf.st_rdev);
min = minor(sbuf.st_rdev);
switch (subsystem_type) {
case DRM_BUS_PCI:
case DRM_BUS_VIRTIO:
- return drmProcessPciDevice(device, node, node_type, maj, min,
+ ret = drmProcessPciDevice(device, node, node_type, maj, min,
fetch_deviceinfo, flags);
+ free(node);
+ return ret;
case DRM_BUS_USB:
- return drmProcessUsbDevice(device, node, node_type, maj, min,
+ ret = drmProcessUsbDevice(device, node, node_type, maj, min,
fetch_deviceinfo, flags);
+ free(node);
+ return ret;
case DRM_BUS_PLATFORM:
- return drmProcessPlatformDevice(device, node, node_type, maj, min,
+ ret = drmProcessPlatformDevice(device, node, node_type, maj, min,
fetch_deviceinfo, flags);
+ free(node);
+ return ret;
case DRM_BUS_HOST1X:
- return drmProcessHost1xDevice(device, node, node_type, maj, min,
+ ret = drmProcessHost1xDevice(device, node, node_type, maj, min,
fetch_deviceinfo, flags);
+ free(node);
+ return ret;
default:
+ free(node);
return -1;
}
}
return drmGetDeviceNameFromFd(fd);
#else
struct stat sbuf;
- char node[PATH_MAX + 1];
+ char *node = NULL;
const char *dev_name;
int node_type;
- int maj, min, n;
+ int maj, min, n, len = 0;
if (fstat(fd, &sbuf))
return NULL;
if (!dev_name)
return NULL;
- n = snprintf(node, PATH_MAX, dev_name, DRM_DIR_NAME, min);
- if (n == -1 || n >= PATH_MAX)
+ len = snprintf(NULL, 0, dev_name, DRM_DIR_NAME, min);
+ if (len < 0)
+ return NULL;
+ len++;
+ node = malloc(len);
+ n = snprintf(node, len, dev_name, DRM_DIR_NAME, min);
+ if (n == -1 || n >= len)
return NULL;
- return strdup(node);
+ return node;
#endif
}