From 3b3d1737be0023791e45dfa357b347c832d2a615 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 5 Apr 2018 12:42:47 +0200 Subject: [PATCH 1/2] rfkill: use our usual style for writing destructors Let's accept NULL values gracefully, and let's return NULL. --- src/rfkill/rfkill.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/rfkill/rfkill.c b/src/rfkill/rfkill.c index bae3aec175..139b4343b0 100644 --- a/src/rfkill/rfkill.c +++ b/src/rfkill/rfkill.c @@ -49,12 +49,12 @@ typedef struct write_queue_item { int state; } write_queue_item; -static void write_queue_item_free(struct write_queue_item *item) -{ - assert(item); +static struct write_queue_item* write_queue_item_free(struct write_queue_item *item) { + if (!item) + return NULL; free(item->file); - free(item); + return mfree(item); } static const char* const rfkill_type_table[NUM_RFKILL_TYPES] = { From bc5e002ef1728f45871d2b0344e3f04108db62c7 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 5 Apr 2018 12:43:08 +0200 Subject: [PATCH 2/2] rfkill: treat ENXIO/ENODEV the same way as ENOENT If an rfkill device disappears between the time we get notified about the existance and we fully opened it we might get ENXIO or ENODEV (i.e. the two kinds of "device not found" errors, which are typically generated when for example a device node has no actual backing device behind it). let's handle that the same way as ENOENT, and downgrade the log message to LOG_DEBUG. Fixes: #8586 --- src/rfkill/rfkill.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/rfkill/rfkill.c b/src/rfkill/rfkill.c index 139b4343b0..4c2ae2b50f 100644 --- a/src/rfkill/rfkill.c +++ b/src/rfkill/rfkill.c @@ -89,8 +89,8 @@ static int find_device( device = udev_device_new_from_subsystem_sysname(udev, "rfkill", sysname); if (!device) - return log_full_errno(errno == ENOENT ? LOG_DEBUG : LOG_ERR, errno, - "Failed to open device %s: %m", sysname); + return log_full_errno(IN_SET(errno, ENOENT, ENXIO, ENODEV) ? LOG_DEBUG : LOG_ERR, errno, + "Failed to open device '%s': %m", sysname); name = udev_device_get_sysattr_value(device, "name"); if (!name) { @@ -148,8 +148,8 @@ static int wait_for_initialized( /* Check again, maybe things changed */ d = udev_device_new_from_subsystem_sysname(udev, "rfkill", sysname); if (!d) - return log_full_errno(errno == ENOENT ? LOG_DEBUG : LOG_ERR, errno, - "Failed to open device %s: %m", sysname); + return log_full_errno(IN_SET(errno, ENOENT, ENXIO, ENODEV) ? LOG_DEBUG : LOG_ERR, errno, + "Failed to open device '%s': %m", sysname); if (udev_device_get_is_initialized(d) != 0) { *ret = d; @@ -313,6 +313,7 @@ static int save_state_queue( r = determine_state_file(udev, event, &state_file); if (r < 0) return r; + save_state_queue_remove(write_queue, event->idx, state_file); item = new0(struct write_queue_item, 1);