usb-device: Fix mismatch add/remove object
The node added and remove does not match which would result in the
entries not being removed properly. Also fixed nullptr access for char*
which can cause sdbus property error.
Tested:
```
$ USB device removed with dev node: /dev/bus/usb/001/114
USB device removed with dev node: /dev/bus/usb/001/117
USB device removed with dev node: /dev/bus/usb/001/116
USB device removed with dev node: /dev/bus/usb/001/115
USB device removed with dev node: /dev/bus/usb/001/113
USB device removed with dev node: /dev/bus/usb/001/110
USB device removed with dev node: /dev/bus/usb/001/104
USB device removed with dev node: /dev/bus/usb/001/106
USB device removed with dev node: /dev/bus/usb/001/107
USB device removed with dev node: /dev/bus/usb/001/108
USB device removed with dev node: /dev/bus/usb/001/109
USB device removed with dev node: /dev/bus/usb/001/105
$ Adding /xyz/openbmc_project/devices/_2f1_2d1_2e5 -> /dev/bus/usb/001/005
Adding /xyz/openbmc_project/devices/_2f1_2d1_2e6 -> /dev/bus/usb/001/006
Adding /xyz/openbmc_project/devices/_2f1_2d1_2e6_2e1 -> /dev/bus/usb/001/007
Adding /xyz/openbmc_project/devices/_2f1_2d1_2e6_2e2 -> /dev/bus/usb/001/008
Adding /xyz/openbmc_project/devices/_2f1_2d1_2e6_2e3 -> /dev/bus/usb/001/009
Adding /xyz/openbmc_project/devices/_2f1_2d1_2e6_2e4 -> /dev/bus/usb/001/010
```
Removing and adding usb devices without the daemon crashing.
Google-Bug-Id: 311478549
Change-Id: I55e6befba51fda72d4343db906c07f0f29d951d3
Signed-off-by: Willy Tu <wltu@google.com>
(cherry picked from commit 5f15f30a4d98a0f08b35115e7858c816f8927fa8)
diff --git a/recipes-phosphor/configuration/entity-manager/0001-Add-USB-Device-discovery-daemon.patch b/recipes-phosphor/configuration/entity-manager/0001-Add-USB-Device-discovery-daemon.patch
index a6f4b1d..ebf4b98 100644
--- a/recipes-phosphor/configuration/entity-manager/0001-Add-USB-Device-discovery-daemon.patch
+++ b/recipes-phosphor/configuration/entity-manager/0001-Add-USB-Device-discovery-daemon.patch
@@ -1,4 +1,4 @@
-From 189ded323cfaed5ea0c0d447f682f528d7dc3ff6 Mon Sep 17 00:00:00 2001
+From 3c018e9c8b1f245eebf8b8e2f2b1276403e6e1b6 Mon Sep 17 00:00:00 2001
From: Harsh Tyagi <harshtya@google.com>
Date: Tue, 14 Mar 2023 17:53:22 -0700
Subject: [PATCH] Add USB Device discovery daemon
@@ -30,8 +30,8 @@
service_files/meson.build | 1 +
.../xyz.openbmc_project.UsbDevice.service | 10 +
src/meson.build | 25 +
- src/usb_device.cpp | 436 ++++++++++++++++++
- 5 files changed, 478 insertions(+)
+ src/usb_device.cpp | 428 ++++++++++++++++++
+ 5 files changed, 470 insertions(+)
create mode 100644 service_files/xyz.openbmc_project.UsbDevice.service
create mode 100644 src/usb_device.cpp
@@ -114,10 +114,10 @@
+endif
diff --git a/src/usb_device.cpp b/src/usb_device.cpp
new file mode 100644
-index 0000000..3d12bb1
+index 0000000..f777ff5
--- /dev/null
+++ b/src/usb_device.cpp
-@@ -0,0 +1,436 @@
+@@ -0,0 +1,428 @@
+#include "config.h"
+
+#include <libudev.h>
@@ -147,6 +147,9 @@
+constexpr std::chrono::duration<int64_t> WAITTIME = std::chrono::seconds(2);
+constexpr std::chrono::duration<int64_t> INITIAL_TIMEOUT =
+ std::chrono::minutes(10);
++constexpr std::chrono::duration<int64_t> DEBUG_SLEEP_TIME =
++ std::chrono::seconds(10);
++
+struct UsbDevice
+{
+ std::string path;
@@ -297,23 +300,17 @@
+ udev_list_entry_foreach(devListEntry, devices)
+ {
+ struct UsbDevice device;
-+
-+ std::string path;
-+ path = udev_list_entry_get_name(devListEntry);
++ std::string path = udev_list_entry_get_name(devListEntry);
+ dev = udev_device_new_from_syspath(udev, path.c_str());
-+
-+ device.path = path;
-+ auto sysPath = udev_device_get_devnode(dev);
-+ device.SysPath = sysPath == nullptr ? "" : std::string(sysPath);
-+
-+ dev = udev_device_get_parent_with_subsystem_devtype(dev, "usb",
-+ "usb_device");
+ if (!dev)
+ {
+ // Not a USB device skip
+ continue;
+ }
+
++ device.path = path;
++ auto sysPath = udev_device_get_devnode(dev);
++ device.SysPath = sysPath == nullptr ? "" : std::string(sysPath);
+ if (DEBUG)
+ {
+ if (device.SysPath.empty())
@@ -391,9 +388,7 @@
+ return;
+ }
+
-+ struct udev_device* dev;
-+
-+ dev = udev_monitor_receive_device(monitor);
++ struct udev_device* dev = udev_monitor_receive_device(monitor);
+ while (dev != nullptr)
+ {
+ auto node = udev_device_get_devnode(dev);
@@ -408,9 +403,6 @@
+
+ if (action == "remove")
+ {
-+ stdplus::print(stderr, "A device was removed with devpath: {}\n",
-+ udev_device_get_sysnum(dev));
-+
+ // Remove object path
+ if (!RemoveIfaceForNode(node, objectServer))
+ {
@@ -432,7 +424,7 @@
+ // if you want to see when a device reboots, the old
+ // DBus object path is removed and creates a new DBus
+ // object path. 10 seconds is a random number
-+ sleep(10);
++ std::this_thread::sleep_for(DEBUG_SLEEP_TIME);
+ }
+
+ sdbusplus::message::object_path objPath(
@@ -456,7 +448,8 @@
+ "UDEVID", objPath.filename().substr(1),
+ sdbusplus::asio::PropertyPermission::readOnly);
+ iface->register_property(
-+ "USBPORT", node, sdbusplus::asio::PropertyPermission::readOnly);
++ "USBPORT", node == nullptr ? std::string() : node,
++ sdbusplus::asio::PropertyPermission::readOnly);
+ iface->register_property(
+ "BUS",
+ usbMapping[vendorId][productId][configuration]
@@ -522,7 +515,6 @@
+ std::shared_ptr<sdbusplus::asio::dbus_interface> iface =
+ objectServer->add_interface(objPath,
+ "xyz.openbmc_project.UsbDevice");
-+
+ iface->register_property("PRODUCT", device.product,
+ sdbusplus::asio::PropertyPermission::readOnly);
+ iface->register_property("VID", device.vendorId,
@@ -555,5 +547,5 @@
+ return 0;
+}
--
-2.43.0.rc1.413.gea7ed67945-goog
+2.43.0.472.g3155946c3a-goog