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