udev: don't loop forever on errors

When we can't find the v4l2 device id, unref the device and continue
instead of looping forever and consuming all memory.

Fixes #219
This commit is contained in:
Wim Taymans 2020-03-24 15:54:58 +01:00
parent f22b7b22a8
commit a1846c9780
2 changed files with 8 additions and 14 deletions

View file

@ -460,18 +460,17 @@ static int enum_devices(struct impl *this)
udev_enumerate_add_match_subsystem(enumerate, "sound"); udev_enumerate_add_match_subsystem(enumerate, "sound");
udev_enumerate_scan_devices(enumerate); udev_enumerate_scan_devices(enumerate);
devices = udev_enumerate_get_list_entry(enumerate); for (devices = udev_enumerate_get_list_entry(enumerate); devices;
devices = udev_list_entry_get_next(devices)) {
while (devices) {
struct udev_device *dev; struct udev_device *dev;
dev = udev_device_new_from_syspath(this->udev, udev_list_entry_get_name(devices)); dev = udev_device_new_from_syspath(this->udev, udev_list_entry_get_name(devices));
if (dev == NULL)
continue;
emit_device(this, ACTION_ADD, true, dev); emit_device(this, ACTION_ADD, true, dev);
udev_device_unref(dev); udev_device_unref(dev);
devices = udev_list_entry_get_next(devices);
} }
udev_enumerate_unref(enumerate); udev_enumerate_unref(enumerate);

View file

@ -338,9 +338,8 @@ static int enum_devices(struct impl *this)
udev_enumerate_add_match_subsystem(enumerate, "video4linux"); udev_enumerate_add_match_subsystem(enumerate, "video4linux");
udev_enumerate_scan_devices(enumerate); udev_enumerate_scan_devices(enumerate);
devices = udev_enumerate_get_list_entry(enumerate); for (devices = udev_enumerate_get_list_entry(enumerate); devices;
devices = udev_list_entry_get_next(devices)) {
while (devices) {
struct udev_device *dev; struct udev_device *dev;
uint32_t id; uint32_t id;
@ -348,14 +347,10 @@ static int enum_devices(struct impl *this)
if (dev == NULL) if (dev == NULL)
continue; continue;
if ((id = get_device_id(this, dev)) == SPA_ID_INVALID) if ((id = get_device_id(this, dev)) != SPA_ID_INVALID)
continue; emit_object_info(this, id, dev);
emit_object_info(this, id, dev);
udev_device_unref(dev); udev_device_unref(dev);
devices = udev_list_entry_get_next(devices);
} }
udev_enumerate_unref(enumerate); udev_enumerate_unref(enumerate);