mirror of
https://github.com/apache/nuttx.git
synced 2025-01-12 18:38:35 +08:00
drivers/usbdev/cdcacm.c: Fix a crash in cdcacm if usbdev gets unregistered while client calls close for the tty
Make sure that the cdcacm is disconnected before the usbdev gets unregistered. Also, check if the device is connected or not in cdcuart_txempty (uart_txempty). Otherwise there may be a crash during uart_tcdrain, called in tty close path, if the usbdev unregistration happens during the loop. This issue can be triggered by monitoring the cable connection status in one thread, sending BOARDIOC_USBDEV_DISCONNECT if the usb cable is detached. In another thread close the ttyACM. Signed-off-by: Jukka Laitinen <jukkax@ssrc.tii.ae>
This commit is contained in:
parent
af6147fb2c
commit
575c608be8
1 changed files with 11 additions and 0 deletions
|
@ -2618,6 +2618,13 @@ static bool cdcuart_txempty(FAR struct uart_dev_s *dev)
|
|||
#endif
|
||||
|
||||
flags = enter_critical_section();
|
||||
|
||||
if (dev->disconnected)
|
||||
{
|
||||
leave_critical_section(flags);
|
||||
return true;
|
||||
}
|
||||
|
||||
priv->ispolling = true;
|
||||
EP_POLL(ep);
|
||||
priv->ispolling = false;
|
||||
|
@ -3012,6 +3019,10 @@ void cdcacm_uninitialize(FAR struct usbdevclass_driver_s *classdev)
|
|||
char devname[CDCACM_DEVNAME_SIZE];
|
||||
int ret;
|
||||
|
||||
/* Disconnect in case we are connected */
|
||||
|
||||
cdcacm_disconnect(classdev, priv->usbdev);
|
||||
|
||||
#ifndef CONFIG_CDCACM_COMPOSITE
|
||||
usbdev_unregister(&drvr->drvr);
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue