collectd: smart: add patch to check udev_enumerate_scan_devices return value
authorFlorian Eckert <fe@dev.tdt.de>
Tue, 15 Mar 2022 14:03:46 +0000 (15:03 +0100)
committerFlorian Eckert <fe@dev.tdt.de>
Thu, 30 Jun 2022 12:45:26 +0000 (14:45 +0200)
The function udev_enumarte_scan_devices returns a value less than 0 on
failure. If this is the case then we terminate the read for this smart
information.

This change was already send upstream. And could be delete in feature
collectd versions.

Signed-off-by: Florian Eckert <fe@dev.tdt.de>
(cherry picked from commit 896a0f0db66950b984f89b7f41bfdf60a47bc499)

utils/collectd/patches/941-Check-udev_enumerate_scan_devices-return-value.patch [new file with mode: 0644]

diff --git a/utils/collectd/patches/941-Check-udev_enumerate_scan_devices-return-value.patch b/utils/collectd/patches/941-Check-udev_enumerate_scan_devices-return-value.patch
new file mode 100644 (file)
index 0000000..176c8f4
--- /dev/null
@@ -0,0 +1,61 @@
+From 289f58c9c96d5478cf200f7a3e62b82e86b12d32 Mon Sep 17 00:00:00 2001
+From: Florian Eckert <fe@dev.tdt.de>
+Date: Tue, 15 Mar 2022 14:56:19 +0100
+Subject: [PATCH] Check udev_enumerate_scan_devices return value
+
+This change checks the return value of the function and cancels the call
+if the returned integer is not greater than or equal to 0.
+
+Signed-off-by: Florian Eckert <fe@dev.tdt.de>
+---
+ src/smart.c | 18 ++++++++++++++++--
+ 1 file changed, 16 insertions(+), 2 deletions(-)
+
+--- a/src/smart.c
++++ b/src/smart.c
+@@ -104,6 +104,7 @@ static int create_ignorelist_by_serial(i
+   struct udev_enumerate *enumerate;
+   struct udev_list_entry *devices, *dev_list_entry;
+   struct udev_device *dev;
++  int r;
+   if (ignorelist_by_serial == NULL)
+     ignorelist_by_serial = ignorelist_create(invert_ignorelist);
+@@ -127,7 +128,13 @@ static int create_ignorelist_by_serial(i
+   }
+   udev_enumerate_add_match_subsystem(enumerate, "block");
+   udev_enumerate_add_match_property(enumerate, "DEVTYPE", "disk");
+-  udev_enumerate_scan_devices(enumerate);
++
++  r = udev_enumerate_scan_devices(enumerate);
++  if (r < 0) {
++    WARNING("smart plugin: udev scan devices failed");
++    return -1;
++  }
++
+   devices = udev_enumerate_get_list_entry(enumerate);
+   if (devices == NULL) {
+     ERROR("udev returned an empty list deviecs");
+@@ -597,6 +604,7 @@ static int smart_read(void) {
+   struct udev_enumerate *enumerate;
+   struct udev_list_entry *devices, *dev_list_entry;
+   struct udev_device *dev;
++  int r;
+   /* Use udev to get a list of disks */
+   handle_udev = udev_new();
+@@ -611,7 +619,13 @@ static int smart_read(void) {
+   }
+   udev_enumerate_add_match_subsystem(enumerate, "block");
+   udev_enumerate_add_match_property(enumerate, "DEVTYPE", "disk");
+-  udev_enumerate_scan_devices(enumerate);
++
++  r = udev_enumerate_scan_devices(enumerate);
++  if (r < 0) {
++    WARNING("smart plugin: udev scan devices failed");
++    return -1;
++  }
++
+   devices = udev_enumerate_get_list_entry(enumerate);
+   if (devices == NULL) {
+     ERROR("udev returned an empty list deviecs");