From a1846c9780e9b8193cb9ce88f4b3f40c5e7659f4 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 24 Mar 2020 15:54:58 +0100 Subject: [PATCH] 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 --- spa/plugins/alsa/alsa-udev.c | 9 ++++----- spa/plugins/v4l2/v4l2-udev.c | 13 ++++--------- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/spa/plugins/alsa/alsa-udev.c b/spa/plugins/alsa/alsa-udev.c index 7a12ee62a..51b19c8b6 100644 --- a/spa/plugins/alsa/alsa-udev.c +++ b/spa/plugins/alsa/alsa-udev.c @@ -460,18 +460,17 @@ static int enum_devices(struct impl *this) udev_enumerate_add_match_subsystem(enumerate, "sound"); udev_enumerate_scan_devices(enumerate); - devices = udev_enumerate_get_list_entry(enumerate); - - while (devices) { + for (devices = udev_enumerate_get_list_entry(enumerate); devices; + devices = udev_list_entry_get_next(devices)) { struct udev_device *dev; 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); udev_device_unref(dev); - - devices = udev_list_entry_get_next(devices); } udev_enumerate_unref(enumerate); diff --git a/spa/plugins/v4l2/v4l2-udev.c b/spa/plugins/v4l2/v4l2-udev.c index d48036254..6ff358a27 100644 --- a/spa/plugins/v4l2/v4l2-udev.c +++ b/spa/plugins/v4l2/v4l2-udev.c @@ -338,9 +338,8 @@ static int enum_devices(struct impl *this) udev_enumerate_add_match_subsystem(enumerate, "video4linux"); udev_enumerate_scan_devices(enumerate); - devices = udev_enumerate_get_list_entry(enumerate); - - while (devices) { + for (devices = udev_enumerate_get_list_entry(enumerate); devices; + devices = udev_list_entry_get_next(devices)) { struct udev_device *dev; uint32_t id; @@ -348,14 +347,10 @@ static int enum_devices(struct impl *this) if (dev == NULL) continue; - if ((id = get_device_id(this, dev)) == SPA_ID_INVALID) - continue; - - emit_object_info(this, id, dev); + if ((id = get_device_id(this, dev)) != SPA_ID_INVALID) + emit_object_info(this, id, dev); udev_device_unref(dev); - - devices = udev_list_entry_get_next(devices); } udev_enumerate_unref(enumerate);