ClamAV学习【4】——cli_magic_scandesc函数浏览

  • Post author:
  • Post category:其他


今晚继续浏览ClamAV代码,挖掘到了cli_magic_scandesc函数,发现前面包装了很多次扫描函数,这里就是最后一层的感觉。一些扫描限制判断加上文件类型判断,采用不同扫描函数处理。

(PS:发现这些函数个头都很大,虽然按着功能分段好理解,但是书本不是说一个函数一个功能模块么?难道是不实际,还是理解错误?)

代码分析如下:

//magic,说明这很神奇
int cli_magic_scandesc(int desc, cli_ctx *ctx)
{
	int ret = CL_CLEAN;
	cli_file_t type, dettype = 0;
	struct stat sb;
	uint8_t typercg = 1;

	//获取文件属性stat结构
    if(fstat(desc, &sb) == -1) {
	cli_errmsg("magic_scandesc: Can't fstat descriptor %d\n", desc);
	return CL_EIO;
    }

	//文件太小无需扫描
    if(sb.st_size <= 5) {
	cli_dbgmsg("Small data (%u bytes)\n", (unsigned int) sb.st_size);
	return CL_CLEAN;
    }

	//引擎已经构建
    if(!ctx->engine) {
	cli_errmsg("CRITICAL: engine == NULL\n");
	return CL_EMALFDB;
    }

	//默认模式扫描
    if(!ctx->options) { /* raw mode (stdin, etc.) */
	cli_dbgmsg("Raw mode: No support for special files\n");
	if((ret = cli_scandesc(desc, ctx, 0, 0, NULL, AC_SCAN_VIR)) == CL_VIRUS)
	    cli_dbgmsg("%s found in descriptor %d\n", *ctx->virname, desc);
	return ret;
    }

	//是否超过设置的扫描限制
    if(cli_updatelimits(ctx, sb.st_size)!=CL_CLEAN)
        return CL_CLEAN;

	//邮件或者压缩文件扫描
    if((SCAN_MAIL || SCAN_ARCHIVE) && ctx->limits && ctx->limits->maxreclevel && ctx->recursion > ctx->limits->maxreclevel) {
        cli_dbgmsg("Archive recursion limit exceeded (level &



版权声明:本文为BetaBin原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。