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,并提供了相应的解决方案。开发者在编写代码时应该注意这些潜在问题,并进行相应的处理,以提高代码的健壮性和安全性。

MudOS 代码中的潜在 Bug 检测

原文地址: https://www.cveoy.top/t/topic/m5wg 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录