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.
This commit is contained in:
Ben Chan
2017-08-21 18:42:25 -07:00
committed by Aleksander Morgado
parent 5a01e54066
commit 76c1a1119c

View File

@@ -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