Details
-
Bug
-
Resolution: Done
-
P1: Critical
-
5.6.0, 5.7.0 Beta
-
None
-
WinRT
-
-
fc35f9496439d7a236f7be1eecae53ad6ddd9112
Description
QNativeSocketEnginePrivate pendingDatagram QList member is appended and popped from by two different threads leading to eventual crash when used with fast UDP senders.
A foreign thread appends in QNativeSocketEnginePrivate::handleNewDatagram.
And the socket owner thread pop QNativeSocketEngine::readDatagram.
Minimal example (can be in the same app instance)
// receiver auto receiver = new QUdpSocket(&app); if (!receiver->bind()) { qFatal("bind() failed"); } auto localPort = receiver->localPort(); QObject::connect(receiver,&QUdpSocket::readyRead, receiver, [receiver]() { QByteArray data(receiver->pendingDatagramSize(), Qt::Uninitialized); receiver->readDatagram(data.data(), data.size()); }); // sender auto sender = new QUdpSocket(&app); auto timer = new QTimer(&app); timer->setInterval(0); timer->setSingleShot(false); QObject::connect(timer, &QTimer::timeout, sender, [sender,localPort]() { sender->writeDatagram({},QHostAddress::LocalHost, localPort); }); timer->start();
Will typically crash in 2-10 seconds somewhere in QList. Doing burst of writeDatagram or running the app in two instances will probably speed it up, but isn't required.