From 4db32dd1342ba8a3461652c8964f1e356c133696 Mon Sep 17 00:00:00 2001 From: Don Gagne Date: Sun, 18 Oct 2020 11:12:23 -0700 Subject: [PATCH] Prevent stale readBytes signalling to call into deleted objects (#9116) --- src/comm/BluetoothLink.cc | 2 ++ src/comm/SerialLink.cc | 2 ++ src/comm/TCPLink.cc | 2 ++ src/comm/UDPLink.cc | 2 ++ 4 files changed, 8 insertions(+) diff --git a/src/comm/BluetoothLink.cc b/src/comm/BluetoothLink.cc index 0babaeeb9..ede027ed6 100644 --- a/src/comm/BluetoothLink.cc +++ b/src/comm/BluetoothLink.cc @@ -86,6 +86,8 @@ void BluetoothLink::disconnect(void) } #endif if(_targetSocket) { + // This prevents stale signals from calling the link after it has been deleted + QObject::connect(_targetSocket, &QBluetoothSocket::readyRead, this, &BluetoothLink::readBytes); _targetSocket->deleteLater(); _targetSocket = nullptr; emit disconnected(); diff --git a/src/comm/SerialLink.cc b/src/comm/SerialLink.cc index 4216a67c4..3ed29fd9f 100644 --- a/src/comm/SerialLink.cc +++ b/src/comm/SerialLink.cc @@ -79,6 +79,8 @@ void SerialLink::_writeBytes(const QByteArray data) void SerialLink::disconnect(void) { if (_port) { + // This prevents stale signals from calling the link after it has been deleted + QObject::disconnect(_port, &QIODevice::readyRead, this, &SerialLink::_readBytes); _port->close(); _port->deleteLater(); _port = nullptr; diff --git a/src/comm/TCPLink.cc b/src/comm/TCPLink.cc index 5e4cc3658..12cd5c049 100644 --- a/src/comm/TCPLink.cc +++ b/src/comm/TCPLink.cc @@ -106,6 +106,8 @@ void TCPLink::disconnect(void) quit(); wait(); if (_socket) { + // This prevents stale signal from calling the link after it has been deleted + QObject::connect(_socket, &QTcpSocket::readyRead, this, &TCPLink::readBytes); _socketIsConnected = false; _socket->disconnectFromHost(); // Disconnect tcp _socket->waitForDisconnected(); diff --git a/src/comm/UDPLink.cc b/src/comm/UDPLink.cc index cb16f61bd..4c14e916e 100644 --- a/src/comm/UDPLink.cc +++ b/src/comm/UDPLink.cc @@ -222,6 +222,8 @@ void UDPLink::disconnect(void) quit(); wait(); if (_socket) { + // This prevents stale signal from calling the link after it has been deleted + QObject::disconnect(_socket, &QUdpSocket::readyRead, this, &UDPLink::readBytes); // Make sure delete happen on correct thread _socket->deleteLater(); _socket = nullptr; -- 2.22.0