今天测试发现qwebsocket有个bug
2017-01-22 17:37
746 查看
发现命令使用时间久了就会丢失mask,mask设置成0,而websocket协议要求客户端给服务器传东西必须带mask=1,发现确实有个bug,代码如下:
文件:src/websockets/qwebsocket_p.cpp 这个函数有可能返回0
quint32 QWebSocketPrivate::generateMaskingKey() const
{
return m_pMaskGenerator->nextMask();
}
文件:src/websockets/qdefaultmaskgenerator_p.cpp
quint32 QDefaultMaskGenerator::nextMask() Q_DECL_NOEXCEPT
{
return quint32((double(qrand()) / RAND_MAX) * std::numeric_limits<quint32>::max());
}
而调用他的地方:
/*!
* \internal
*/
QByteArray QWebSocketPrivate::getFrameHeader(QWebSocketProtocol::OpCode opCode,
quint64 payloadLength, quint32 maskingKey,
bool lastFrame)
{
QByteArray header;
quint8 byte = 0x00;
bool ok = payloadLength <= 0x7FFFFFFFFFFFFFFFULL;
if (Q_LIKELY(ok)) {
//FIN, RSV1-3, opcode (RSV-1, RSV-2 and RSV-3 are zero)
byte = static_cast<quint8>((opCode & 0x0F) | (lastFrame ? 0x80 : 0x00));
header.append(static_cast<char>(byte));
byte = 0x00;
if (maskingKey != 0)
byte |= 0x80;
if (payloadLength <= 125) {
byte |= static_cast<quint8>(payloadLength);
header.append(static_cast<char>(byte));
} else if (payloadLength <= 0xFFFFU) {
byte |= 126;
header.append(static_cast<char>(byte));
quint16 swapped = qToBigEndian<quint16>(static_cast<quint16>(payloadLength));
header.append(static_cast<const char *>(static_cast<const void *>(&swapped)), 2);
} else if (payloadLength <= 0x7FFFFFFFFFFFFFFFULL) {
byte |= 127;
header.append(static_cast<char>(byte));
quint64 swapped = qToBigEndian<quint64>(payloadLength);
header.append(static_cast<const char *>(static_cast<const void *>(&swapped)), 8);
}
if (maskingKey != 0) {
const quint32 mask = qToBigEndian<quint32>(maskingKey);
header.append(static_cast<const char *>(static_cast<const void *>(&mask)),
sizeof(quint32));
}
} else {
setErrorString(QStringLiteral("WebSocket::getHeader: payload too big!"));
Q_EMIT q_ptr->error(QAbstractSocket::DatagramTooLargeError);
}
return header;
}
很明显这个值在随机的时候可能出现0,而出现0的时候就出错了
文件:src/websockets/qwebsocket_p.cpp 这个函数有可能返回0
quint32 QWebSocketPrivate::generateMaskingKey() const
{
return m_pMaskGenerator->nextMask();
}
文件:src/websockets/qdefaultmaskgenerator_p.cpp
quint32 QDefaultMaskGenerator::nextMask() Q_DECL_NOEXCEPT
{
return quint32((double(qrand()) / RAND_MAX) * std::numeric_limits<quint32>::max());
}
而调用他的地方:
/*!
* \internal
*/
QByteArray QWebSocketPrivate::getFrameHeader(QWebSocketProtocol::OpCode opCode,
quint64 payloadLength, quint32 maskingKey,
bool lastFrame)
{
QByteArray header;
quint8 byte = 0x00;
bool ok = payloadLength <= 0x7FFFFFFFFFFFFFFFULL;
if (Q_LIKELY(ok)) {
//FIN, RSV1-3, opcode (RSV-1, RSV-2 and RSV-3 are zero)
byte = static_cast<quint8>((opCode & 0x0F) | (lastFrame ? 0x80 : 0x00));
header.append(static_cast<char>(byte));
byte = 0x00;
if (maskingKey != 0)
byte |= 0x80;
if (payloadLength <= 125) {
byte |= static_cast<quint8>(payloadLength);
header.append(static_cast<char>(byte));
} else if (payloadLength <= 0xFFFFU) {
byte |= 126;
header.append(static_cast<char>(byte));
quint16 swapped = qToBigEndian<quint16>(static_cast<quint16>(payloadLength));
header.append(static_cast<const char *>(static_cast<const void *>(&swapped)), 2);
} else if (payloadLength <= 0x7FFFFFFFFFFFFFFFULL) {
byte |= 127;
header.append(static_cast<char>(byte));
quint64 swapped = qToBigEndian<quint64>(payloadLength);
header.append(static_cast<const char *>(static_cast<const void *>(&swapped)), 8);
}
if (maskingKey != 0) {
const quint32 mask = qToBigEndian<quint32>(maskingKey);
header.append(static_cast<const char *>(static_cast<const void *>(&mask)),
sizeof(quint32));
}
} else {
setErrorString(QStringLiteral("WebSocket::getHeader: payload too big!"));
Q_EMIT q_ptr->error(QAbstractSocket::DatagramTooLargeError);
}
return header;
}
很明显这个值在随机的时候可能出现0,而出现0的时候就出错了
相关文章推荐
- 今天无意中又发现一个记事本的 bug
- 今天发现一个非常奇怪的VSIDE BUG,经过1个小时的研究解决
- 今天看到个关于讨论测试Socket服务器端满负荷链接的讨论帖!y
- 软件测试的目的是验证需求还是发现bug?
- 软件测试的目的是验证需求还是发现bug?
- 今天发现一个BUG
- 今天意外发现CSDN博客BUG
- 今天发现了VISTA系统的一个BUG
- 今天做了内存测试,发现真的是内存问题导致的一连串的问题
- Web系统与后台Server的socket接口测试
- 今天调试时,无意发现ie的bug page
- 今天发现一个hibernate的bug,或者说一个应该注意的地方比较合适
- 今天又发现了两个BUG
- 今天发现了vmware6.o ace的一个bug
- 今天发现了JBuilder 2006 一个BUG,关于资源文件重构后的BUG
- 今天无意中又发现一个记事本的 bug
- 今天发现dbforms的Table.getIntercepors()重复添加本地interceptor,疑为bug
- 今天发现了有CSDN测试频道
- 今天发现自己的程序有个小bug,细节不可小觑呀
- 今天发现rc4算法的bug