MudOS 代码中的潜在 Bug 检测
MudOS 代码中的潜在 Bug 检测
本文分析了 MudOS 代码中存在的潜在 Bug,并提供了相应的解决方案,旨在提高代码的健壮性和安全性。
1. getoid 函数
在 getoid 函数中,如果传入的 ob 为空,则使用 previous_object() 作为参数。但如果调用 getoid 的函数本身就是在全局范围内调用的,那么 previous_object() 将会是 0,这会导致 sscanf 函数无法正确解析文件名,从而返回 0。
解决方案:
需要加入对 previous_object() 是否为 0 的判断。
varargs int getoid(object ob)
{
int id;
if (!ob) {
ob = previous_object();
if (!ob) return 0; // 添加判断
}
sscanf(file_name(ob), "%*s#%d", id);
return id;
}
2. file_owner 函数
在 file_owner 函数中,如果传入的文件名不是以 '/' 开头,会在文件名前加上 '/'。但如果文件名已经是以 '/' 开头,这个操作是多余的。
解决方案:
需要加入对文件名是否已经是以 '/' 开头的判断。
string file_owner(string file)
{
string name, rest, dir;
if (file[0] != '/')
{
file = '/' + file;
}
if (sscanf(file, '/u/%s/%s/%s', dir, name, rest) == 3)
{
return name;
}
return 0;
}
3. creator_file 函数
在 creator_file 函数中,如果 path[0] 不是特定的字符串,函数会返回 'Unknow'。这个字符串应该是 'Unknown'。
解决方案:
将 'Unknow' 更正为 'Unknown'。
string creator_file(string file)
{
string *path;
path = explode(file, '/') - ({ 0 });
switch (path[0])
{
case 'adm':
if (file == SIMUL_EFUN_OB) return 'MudOS';
else return ROOT_UID;
case 'cmds':
case 'shadow':
return ROOT_UID;
case 'u':
if (sizeof(path) >= 3) return path[1];
case 'd':
return 'Domain';
case 'clone':
return 'Clone';
case 'feature':
return 'Feature';
case 'kungfu':
return 'Kungfu';
case 'inherit':
return 'Inherit';
default:
return 'Unknown'; // 更正为 'Unknown'
}
}
4. is_root 函数
在 is_root 函数中,如果传入的参数不是字符串或对象,函数会返回 1,即假定它是 root。这是不合理的,应该抛出错误或者返回 0。
解决方案:
添加对参数类型的判断,并抛出错误。
int is_root(mixed ob)
{
if (stringp(ob))
return (SECURITY_D->get_status(ob) == '(admin)');
if (objectp(ob))
{
if (geteuid(ob) == ROOT_UID)
// Root object want to execute
return 1;
return (SECURITY_D->get_status(geteuid(ob)) == '(admin)');
}
error("is_root: Invalid argument type."); // 抛出错误
return 0; // 返回 0
}
5. destruct 函数
在 destruct 函数中,调用 tell_room 之前应该检查 ob 的环境是否存在,否则会出现错误。
解决方案:
添加对环境存在的判断。
void destruct(object ob)
{
if (ob)
{
if (previous_object()) ob->remove(geteuid(previous_object()));
else ob->remove(0);
}
if(environment(ob)) // 添加判断
tell_room(environment(ob),ZJOBOUT+'look '+file_name(ob)+'
');
efun::destruct(ob);
}
6. present 函数
在 present 函数中,如果传入的是一个字符串,会尝试查找对应的对象。但如果这个对象不存在,会返回 0,而此时调用 efun::present(obj,ob) 会抛出错误。需要先检查 obj 是否存在。
解决方案:
添加对 obj 存在的判断。
object present( mixed str, object ob )
{
object obj;
if(!ob&&previous_object())
{
ob = environment(previous_object());
}
if(stringp(str)&&(obj=find_object(str)))
{
if(ob) return efun::present(obj,ob);
else return efun::present(obj);
}
if(obj) // 添加判断
return efun::present(str,ob);
else return efun::present(str);
}
以上分析了 MudOS 代码中存在的潜在 Bug,并提供了相应的解决方案。开发者在编写代码时应该注意这些潜在问题,并进行相应的处理,以提高代码的健壮性和安全性。
原文地址: https://www.cveoy.top/t/topic/m5wg 著作权归作者所有。请勿转载和采集!