aboutsummaryrefslogtreecommitdiff
path: root/src/mm-base-manager.c
diff options
context:
space:
mode:
authorBen Chan <benchan@chromium.org>2017-08-21 18:42:25 -0700
committerAleksander Morgado <aleksander@aleksander.es>2017-08-22 13:54:32 +0200
commit76c1a1119cdb08c710b5f8df35c31883a466a64a (patch)
tree023ac2e04ec02dd995ad652fb051fd7d82f991fd /src/mm-base-manager.c
parent5a01e5406660bc4f5a3cf68254510e867f89a457 (diff)
base-manager: avoid events of USB interface from removing MMDevice
When a USB modem is switching its USB configuration, udev may deliver the remove events of USB interfaces associated with the old USB configuration and the add events of USB interfaces associated with the new USB configuration in an interleaved fashion. An interleaved remove event of USB interface could trigger the special case handling code in mm-base-manager.c:device_removed() and incorrectly remove a MMDevice under probing. See https://lists.freedesktop.org/archives/modemmanager-devel/2017-August/005626.html for more details. This patch adds a check to ensure that only remove events of USB device (i.e. not interface) can trigger the special handling code.
Diffstat (limited to 'src/mm-base-manager.c')
-rw-r--r--src/mm-base-manager.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/mm-base-manager.c b/src/mm-base-manager.c
index 48e2f25d..f909ce6f 100644
--- a/src/mm-base-manager.c
+++ b/src/mm-base-manager.c
@@ -240,6 +240,19 @@ device_removed (MMBaseManager *self,
return;
}
+#if defined WITH_UDEV
+ /* When a USB modem is switching its USB configuration, udev may deliver
+ * the remove events of USB interfaces associated with the old USB
+ * configuration and the add events of USB interfaces associated with the
+ * new USB configuration in an interleaved fashion. As we don't want a
+ * remove event of an USB interface trigger the removal of a MMDevice for
+ * the special case being handled here, we ignore any remove event with
+ * DEVTYPE != usb_device.
+ */
+ if (g_strcmp0 (mm_kernel_device_get_property (kernel_device, "DEVTYPE"), "usb_device") != 0)
+ return;
+#endif
+
/* This case is designed to handle the case where, at least with kernel 2.6.31, unplugging
* an in-use ttyACMx device results in udev generating remove events for the usb, but the
* ttyACMx device (subsystem tty) is not removed, since it was in-use. So if we have not