该bug只对windows操作系统架设的bnetd及pvpgn服务器起作用
其原理是windows操作系统禁止了一些保留字作为文件名, 如com1, con, nul, prn, lpt1等等
在windows系统下, 当使用这些文件名作为游戏账号或查询这些账号状态时, 会导致服务器程序死锁或崩溃
此bug对部分1.09, 1.10, 1.11版本的服务器有影响
经过后续分析, 发现产生这个问题的原因是当服务器在查找某个acc的时候, 会首先判断这个acc所在的user文件是否存在
这个判断机制在判断这些DOS Device的时候会呈现成功状态
之后服务器会用fopen尝试打开该user文件
打开也是成功的, 但打开的并不是文件, 而是系统保留的DOS Device设备,(比如com1串口)
之后服务器会用read去读取这个文件, 实际上对windows系统来说是在读取串口数据
而串口并没有数据返回, 于是服务器软件在这里持续不断地等待, 呈假死状态
判断一个服务器是否存在这个bug的简单方法是输入/m *com1 ni hao
该bug最新解决方法 (以bnetd 5.2.9为例)
修改account.c文件accountlist_load_account函数889行
if (stat(pathname, &statbuf) < 0) {
增加一个条件判断
改为
if (stat(pathname, &statbuf) < 0 || (statbuf.st_size == 0 && statbuf.st_mtime == -1)) {
若windows系统的DOS Device保留设备在stat查询状态值得时候, 返回的文件size为0, 最后访问时间mtime为invalid time(-1)
满足这个条件即可断定此文件为不可访问状态 |