static void gpt_printName(uint16_t name[], const char* msg) { char *namestr; namestr = (char*)cli_utf16toascii((char*)name, 72); cli_dbgmsg("%s: %s\n", msg, namestr); free(namestr); }
cli_file_t cli_filetype2(int desc, const struct cl_engine *engine) { unsigned char smallbuff[MAGIC_BUFFER_SIZE + 1], *decoded, *bigbuff; int bread, sret; cli_file_t ret = CL_TYPE_UNKNOWN_DATA; struct cli_matcher *root; struct cli_ac_data mdata; memset(smallbuff, 0, sizeof(smallbuff)); if((bread = read(desc, smallbuff, MAGIC_BUFFER_SIZE)) > 0) ret = cli_filetype(smallbuff, bread); if(engine && ret == CL_TYPE_UNKNOWN_TEXT) { root = engine->root[0]; if(!root) return ret; if(cli_ac_initdata(&mdata, root->ac_partsigs, AC_DEFAULT_TRACKLEN)) return ret; sret = cli_ac_scanbuff(smallbuff, bread, NULL, engine->root[0], &mdata, 1, 0, 0, -1, NULL); cli_ac_freedata(&mdata); if(sret >= CL_TYPENO) { ret = sret; } else { if(cli_ac_initdata(&mdata, root->ac_partsigs, AC_DEFAULT_TRACKLEN)) return ret; decoded = (unsigned char *) cli_utf16toascii((char *) smallbuff, bread); if(decoded) { sret = cli_ac_scanbuff(decoded, strlen((char *) decoded), NULL, engine->root[0], &mdata, 1, 0, 0, -1, NULL); free(decoded); if(sret == CL_TYPE_HTML) ret = CL_TYPE_HTML_UTF16; } cli_ac_freedata(&mdata); if((((struct cli_dconf*) engine->dconf)->phishing & PHISHING_CONF_ENTCONV) && ret != CL_TYPE_HTML_UTF16) { struct entity_conv conv; const size_t conv_size = 2*bread < 256 ? 256 : 2*bread; if(init_entity_converter(&conv,UNKNOWN,conv_size) == 0) { int end = 0; m_area_t area; area.buffer = (unsigned char *) smallbuff; area.length = bread; area.offset = 0; while(!end) { if(cli_ac_initdata(&mdata, root->ac_partsigs, AC_DEFAULT_TRACKLEN)) return ret; decoded = encoding_norm_readline(&conv, NULL, &area, bread); if(decoded) { sret = cli_ac_scanbuff(decoded, strlen((const char *) decoded), NULL, engine->root[0], &mdata, 1, 0, 0, -1, NULL); free(decoded); if(sret == CL_TYPE_HTML) { ret = CL_TYPE_HTML; end = 1; } } else end = 1; cli_ac_freedata(&mdata); } entity_norm_done(&conv); } else { cli_warnmsg("cli_filetype2: Error initializing entity converter\n"); } } } } if(ret == CL_TYPE_UNKNOWN_DATA || ret == CL_TYPE_UNKNOWN_TEXT) { if(!(bigbuff = (unsigned char *) cli_calloc(37638 + 1, sizeof(unsigned char)))) return ret; lseek(desc, 0, SEEK_SET); if((bread = read(desc, bigbuff, 37638)) > 0) { bigbuff[bread] = 0; switch(is_tar(bigbuff, bread)) { case 1: ret = CL_TYPE_OLD_TAR; cli_dbgmsg("Recognized old fashioned tar file\n"); break; case 2: ret = CL_TYPE_POSIX_TAR; cli_dbgmsg("Recognized POSIX tar file\n"); break; } } if(ret == CL_TYPE_UNKNOWN_DATA || ret == CL_TYPE_UNKNOWN_TEXT) { if(!memcmp(bigbuff + 32769, "CD001" , 5) || !memcmp(bigbuff + 37633, "CD001" , 5)) { cli_dbgmsg("Recognized ISO 9660 CD-ROM data\n"); ret = CL_TYPE_DATA; } else if(!memcmp(bigbuff + 32776, "CDROM" , 5)) { cli_dbgmsg("Recognized High Sierra CD-ROM data\n"); ret = CL_TYPE_DATA; } } free(bigbuff); } return ret; }