Commit ed89ad4c authored by Dimitris Lampridis's avatar Dimitris Lampridis

sw: be more careful with sysfs attributes

in case the device still has the FTDI VID and PID, the ftdi_sio module
might be loaded, in which case some of the udev matches will not have
attributes such as "busnum", "devnum" (and certainly not "serial").

We can be more careful by checking if  udev_device_get_sysattr_value()
returns NULL before doing the strcpy() to avoid segfaults.
parent b6339620
......@@ -43,15 +43,27 @@ struct oattnusb_devarray *oattnusb_get_devarray(unsigned int vendor_id, unsigned
goto out;
const char *path = udev_list_entry_get_name(ptr);
struct udev_device *dev = udev_device_new_from_syspath(udev, path);
struct oattnusb_usb_dev *entry = &usb_dev[found_devs];
strcpy(entry->path, path);
strcpy(entry->busnum, udev_device_get_sysattr_value(dev, "busnum"));
strcpy(entry->devnum, udev_device_get_sysattr_value(dev, "devnum"));
strcpy(entry->devno, udev_device_get_sysattr_value(dev, "dev"));
strcpy(entry->serial, udev_device_get_sysattr_value(dev, "serial"));
strcpy(entry->busport, rindex(entry->path, '/') + 1);
found_devs += 1;
const char *busnum = udev_device_get_sysattr_value(dev, "busnum");
const char *devnum = udev_device_get_sysattr_value(dev, "devnum");
if (busnum && devnum) {
const char *devno = udev_device_get_sysattr_value(dev, "dev");
const char *serial = udev_device_get_sysattr_value(dev, "serial");
struct oattnusb_usb_dev *entry = &usb_dev[found_devs];
strcpy(entry->path, path);
strcpy(entry->busnum, busnum);
strcpy(entry->devnum, devnum);
strcpy(entry->devno, devno);
if (serial) {
strcpy(entry->serial, serial);
}
else {
strcpy(entry->serial, "EMPTY");
}
strcpy(entry->busport, rindex(entry->path, '/') + 1);
found_devs += 1;
}
udev_device_unref(dev);
}
out:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment