cyanray / LightWebSocketClient

A simple cross-platform WebSocket client, written in C++11.
MIT License
11 stars 2 forks source link

Websocket 库有潜在的 Segmentation fault 的风险 #1

Closed cyanray closed 3 years ago

cyanray commented 3 years ago

select 模型的特点,socket 的值不能大于1024。 否则 FD_SET 宏会溢出,导致 Segmentation fault。

最近出现了奇怪的现象,Websocket 库中的 wsSocket 成员(用于保存 Websocket 的套接字),它的值会在运行一段时间后,莫名其妙地被修改。然后又被自动修改回来(这是最诡异的)。使用以下代码检测,发现它的值变为了 1432497648。由于超出了 1024 的大小,所以会导致 Segmentation fault。

if (sock <= 0 || sock >= 1023)
{
    cout << "invalid sock: " << (int)(sock) << endl;
    continue;
}
FD_SET(sock, &fds_read);

mirai-cpp 版本:master 分支 操作系统: Debian 4.19.146-1 (2020-09-17) x86_64 GNU/Linux

由于无法解释这个修改是如何发生的,只能暂时在执行 FD_SET(sock, &fds_read); 前对 sock 的值进行检测,确保 sock 的值在范围内。

cyanray commented 3 years ago

https://github.com/cyanray/mirai-cpp/blob/master/include/mirai/third-party/WebSocketClient.cpp#L340

破案,这一行多了个引号。

cyanray commented 3 years ago

bug fixed.