diff options
author | Andrew Stanley-Jones <andrew.stanley-jones@nokia.com> | 2012-06-19 16:35:29 +1000 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-06-20 07:44:33 +0200 |
commit | 19a2a628a64a7f924411d7b43854ab053d01cd7e (patch) | |
tree | e844c407dcd40156078ad0c26ba7856bb4beb511 /src/tools | |
parent | 761640c36a3127be7993f669b7206bdd37125d8d (diff) |
Fix sfwlisten
If sfwlisten listens on several interfaces it could crash
since the QUdpSocket was delete.
Change-Id: I0a91a98477b70fa01ac2493a5f7ac1915498bc73
Reviewed-by: Zsolt Simon <zsolt.simon@nokia.com>
Reviewed-by: Lincoln Ramsay <lincoln.ramsay@nokia.com>
Diffstat (limited to 'src/tools')
-rw-r--r-- | src/tools/sfwlisten/main.cpp | 128 |
1 files changed, 67 insertions, 61 deletions
diff --git a/src/tools/sfwlisten/main.cpp b/src/tools/sfwlisten/main.cpp index 87a91efe..a4a4ddeb 100644 --- a/src/tools/sfwlisten/main.cpp +++ b/src/tools/sfwlisten/main.cpp @@ -70,7 +70,7 @@ public slots: private: QString intfFilter; QTimer socketCheck; - QUdpSocket *socket; + QList<QUdpSocket *> sockets; }; SFWReceiver::SFWReceiver(const QString &intfFilter) : intfFilter(intfFilter) @@ -93,7 +93,7 @@ void SFWReceiver::makeSockets() || intf.name().startsWith("tun") || intf.name().startsWith("tap")) continue; - socket = new QUdpSocket(this); + QUdpSocket *socket = new QUdpSocket(this); printf("Trying interface %s ...", qPrintable(intf.name())); if (!socket->bind(QHostAddress::AnyIPv4, 10520, QUdpSocket::ShareAddress)) { printf("Couldn't bind: %s\n", qPrintable(socket->errorString())); @@ -108,6 +108,7 @@ void SFWReceiver::makeSockets() } printf("ok\n"); + sockets.append(socket); if (!gotone) { connect(socket, SIGNAL(readyRead()), this, SLOT(socketReadyRead())); @@ -128,94 +129,99 @@ void SFWReceiver::socketVerify() { QList<QNetworkInterface> intfs = QNetworkInterface::allInterfaces(); bool gotone = false; - QString name = socket->multicastInterface().name(); - foreach (const QNetworkInterface &intf, intfs) { - if (intf.name() == name) { - gotone = true; - break; + foreach (QUdpSocket *socket, sockets) { + QString name = socket->multicastInterface().name(); + + foreach (const QNetworkInterface &intf, intfs) { + if (intf.name() == name) { + gotone = true; + break; + } } - } - if (!gotone) { - printf("Interface down...\n"); - delete socket; - socket = 0; - makeSockets(); + if (!gotone) { + printf("Interface down...\n"); + delete socket; + sockets.removeAll(socket); + makeSockets(); + } } } void SFWReceiver::socketReadyRead() { - QString intf = socket->multicastInterface().name(); - - while (socket->hasPendingDatagrams()) { - QByteArray dgram; - dgram.resize(socket->pendingDatagramSize()); - socket->readDatagram(dgram.data(), dgram.size()); - - QBuffer buff(&dgram); - buff.open(QIODevice::ReadOnly); - QDataStream ds(&buff); - - quint8 hour,minute,second; - quint16 msec; - ds >> hour; - ds >> minute; - ds >> second; - ds >> msec; - - qint32 pid; - ds >> pid; - - char *str; - uint len; - - ds.readBytes(str, len); - QByteArray appName(str, len); - delete[] str; - - QTime t = QTime::currentTime(); - printf("{%4s} %2d:%02d:%02d.%03d ", qPrintable(intf), hour, minute, - second, msec); - printf("[%5d/%10s] ", pid, appName.constData()); - while (!ds.atEnd()) { + foreach (QUdpSocket *socket, sockets) { + QString intf = socket->multicastInterface().name(); + + while (socket->hasPendingDatagrams()) { + QByteArray dgram; + dgram.resize(socket->pendingDatagramSize()); + socket->readDatagram(dgram.data(), dgram.size()); + + QBuffer buff(&dgram); + buff.open(QIODevice::ReadOnly); + QDataStream ds(&buff); + + quint8 hour,minute,second; + quint16 msec; + ds >> hour; + ds >> minute; + ds >> second; + ds >> msec; + + qint32 pid; + ds >> pid; + + char *str; + uint len; + ds.readBytes(str, len); - QByteArray termName(str, len); + QByteArray appName(str, len); delete[] str; - printf("{%s, ", termName.constData()); - - qint8 type; - ds >> type; - DataType dt = static_cast<DataType>(type); - switch (dt) { - case Int32Type: + QTime t = QTime::currentTime(); + printf("{%4s} %2d:%02d:%02d.%03d ", qPrintable(intf), hour, minute, + second, msec); + printf("[%5d/%10s] ", pid, appName.constData()); + while (!ds.atEnd()) { + ds.readBytes(str, len); + QByteArray termName(str, len); + delete[] str; + + printf("{%s, ", termName.constData()); + + qint8 type; + ds >> type; + DataType dt = static_cast<DataType>(type); + switch (dt) { + case Int32Type: { qint32 data; ds >> data; printf("%d} ", data); } - break; - case FloatType: + break; + case FloatType: { float data; ds >> data; printf("%.4f} ", data); } - break; - case StringType: + break; + case StringType: { ds.readBytes(str, len); QByteArray ba(str, len); ba.truncate(35); printf("'%s'} ", ba.constData()); } - break; + break; + } } - } - printf("\n"); + printf("\n"); + } } } |