X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Fsignalproxy.cpp;h=82db1abf8e4cc166b56d13c6048abeaef7410e03;hp=4308d8a8fce9ba5a081b4da22b79830e0c60ad08;hb=b2efa6809ee09b70be19c0f66e0fcd6e57bf64bc;hpb=1eb21546673535f5707aa6346e8c749b928cd772 diff --git a/src/common/signalproxy.cpp b/src/common/signalproxy.cpp index 4308d8a8..82db1abf 100644 --- a/src/common/signalproxy.cpp +++ b/src/common/signalproxy.cpp @@ -1055,28 +1055,33 @@ bool SignalProxy::readDataFromDevice(QIODevice *dev, quint32 &blockSize, QVarian } if(blockSize > 1 << 22) { - qWarning() << qPrintable(tr("Client tried to send package larger than max package size!")); - QAbstractSocket *sock = qobject_cast(dev); - qWarning() << qPrintable(tr("Disconnecting")) << (sock ? qPrintable(sock->peerAddress().toString()) : qPrintable(tr("local client"))); - dev->close(); + disconnectDevice(dev, tr("Client tried to send package larger than max package size!")); + return false; + } + + if(blockSize == 0) { + disconnectDevice(dev, tr("Client tried to send 0 byte package!")); return false; } if(dev->bytesAvailable() < blockSize) return false; + blockSize = 0; + if(compressed) { QByteArray rawItem; in >> rawItem; - // debug check + int nbytes = rawItem.size(); - if (nbytes <= 4) { + if(nbytes <= 4) { const char *data = rawItem.constData(); - if (nbytes < 4 || (data[0]!=0 || data[1]!=0 || data[2]!=0 || data[3]!=0)) - qWarning() << "receieved corrupted compressed data:" - << blockSize << rawItem << rawItem.size() << dev; + if(nbytes < 4 || (data[0]!=0 || data[1]!=0 || data[2]!=0 || data[3]!=0)) { + disconnectDevice(dev, tr("Client sent corrupted compressed data!")); + return false; + } } - // end + rawItem = qUncompress(rawItem); QDataStream itemStream(&rawItem, QIODevice::ReadOnly); @@ -1086,7 +1091,10 @@ bool SignalProxy::readDataFromDevice(QIODevice *dev, quint32 &blockSize, QVarian in >> item; } - blockSize = 0; + if(!item.isValid()) { + disconnectDevice(dev, tr("Client sent corrupt data: unable to load QVariant!")); + return false; + } return true; } @@ -1205,6 +1213,15 @@ void SignalProxy::customEvent(QEvent *event) { } } +void SignalProxy::disconnectDevice(QIODevice *dev, const QString &reason) { + if(!reason.isEmpty()) + qWarning() << qPrintable(reason); + QAbstractSocket *sock = qobject_cast(dev); + if(sock) + qWarning() << qPrintable(tr("Disconnecting")) << qPrintable(sock->peerAddress().toString()); + dev->close(); +} + void SignalProxy::updateLag(IODevicePeer *peer, int lag) { peer->lag = lag; if(proxyMode() == Client) {