YR_API int yr_initialize(void) { uint32_t def_stack_size = DEFAULT_STACK_SIZE; int i; init_count++; if (init_count > 1) return ERROR_SUCCESS; for (i = 0; i < 256; i++) { if (i >= 'a' && i <= 'z') altercase[i] = i - 32; else if (i >= 'A' && i <= 'Z') altercase[i] = i + 32; else altercase[i] = i; lowercase[i] = tolower(i); } FAIL_ON_ERROR(yr_heap_alloc()); FAIL_ON_ERROR(yr_thread_storage_create(&tidx_key)); FAIL_ON_ERROR(yr_thread_storage_create(&recovery_state_key)); #if defined HAVE_LIBCRYPTO && OPENSSL_VERSION_NUMBER < 0x10100000L openssl_locks = (YR_MUTEX*) OPENSSL_malloc( CRYPTO_num_locks() * sizeof(YR_MUTEX)); for (i = 0; i < CRYPTO_num_locks(); i++) yr_mutex_create(&openssl_locks[i]); CRYPTO_set_id_callback(thread_id); CRYPTO_set_locking_callback(locking_function); #endif FAIL_ON_ERROR(yr_re_initialize()); FAIL_ON_ERROR(yr_modules_initialize()); // Initialize default configuration options FAIL_ON_ERROR(yr_set_configuration(YR_CONFIG_STACK_SIZE, &def_stack_size)); return ERROR_SUCCESS; }
YR_API int yr_compiler_get_rules( YR_COMPILER* compiler, YR_RULES** rules) { YR_RULES* yara_rules; YARA_RULES_FILE_HEADER* rules_file_header; *rules = NULL; if (compiler->compiled_rules_arena == NULL) FAIL_ON_ERROR(_yr_compiler_compile_rules(compiler)); yara_rules = (YR_RULES*) yr_malloc(sizeof(YR_RULES)); if (yara_rules == NULL) return ERROR_INSUFICIENT_MEMORY; FAIL_ON_ERROR_WITH_CLEANUP( yr_arena_duplicate(compiler->compiled_rules_arena, &yara_rules->arena), yr_free(yara_rules)); rules_file_header = (YARA_RULES_FILE_HEADER*) yr_arena_base_address( yara_rules->arena); yara_rules->externals_list_head = rules_file_header->externals_list_head; yara_rules->rules_list_head = rules_file_header->rules_list_head; yara_rules->match_table = rules_file_header->match_table; yara_rules->transition_table = rules_file_header->transition_table; yara_rules->code_start = rules_file_header->code_start; yara_rules->tidx_mask = 0; FAIL_ON_ERROR_WITH_CLEANUP( yr_mutex_create(&yara_rules->mutex), // cleanup yr_arena_destroy(yara_rules->arena); yr_free(yara_rules)); *rules = yara_rules; return ERROR_SUCCESS; }