void OtnDeleteData(void *data) { OptTreeNode *otn = (OptTreeNode *)data; OptFpList *opt_func; if (otn == NULL) return; opt_func = otn->opt_func; while (opt_func != NULL) { /* For each of the pattern matcher options in this rule, * delete the data associated with it. This is the only * rule option type (as of now) that this is required for since * patterns are not added to the hash table (via * add_detection_option()) until FinalizeContentUniqueness() is * called -- after the duplicate OTN checks. * * All other rule option types are added to the hash table * at parse time, thus the data associated with that rule * option is cleaned from the hash table when the table itself * is cleaned up. */ OptFpList *tmp = opt_func; opt_func = opt_func->next; if ((tmp->OptTestFunc == CheckANDPatternMatch) || (tmp->OptTestFunc == CheckUriPatternMatch)) { PatternMatchFree(tmp->context); } } }
int detection_hash_free_func(void *option_key, void *data) { detection_option_key_t *key = (detection_option_key_t*)option_key; switch (key->option_type) { /* Call free function specific to the key type */ case RULE_OPTION_TYPE_ASN1: free(key->option_data); break; case RULE_OPTION_TYPE_BYTE_TEST: free(key->option_data); break; case RULE_OPTION_TYPE_BYTE_JUMP: free(key->option_data); break; case RULE_OPTION_TYPE_FLOW: free(key->option_data); break; case RULE_OPTION_TYPE_CVS: free(key->option_data); break; case RULE_OPTION_TYPE_DSIZE: free(key->option_data); break; case RULE_OPTION_TYPE_FLOWBIT: FlowBitsFree(key->option_data); break; case RULE_OPTION_TYPE_FTPBOUNCE: /* Data is NULL, nothing to free */ break; case RULE_OPTION_TYPE_ICMP_CODE: free(key->option_data); break; case RULE_OPTION_TYPE_ICMP_ID: free(key->option_data); break; case RULE_OPTION_TYPE_ICMP_SEQ: free(key->option_data); break; case RULE_OPTION_TYPE_ICMP_TYPE: free(key->option_data); break; case RULE_OPTION_TYPE_IP_FRAGBITS: free(key->option_data); break; case RULE_OPTION_TYPE_IP_FRAG_OFFSET: free(key->option_data); break; case RULE_OPTION_TYPE_IP_ID: free(key->option_data); break; case RULE_OPTION_TYPE_IP_OPTION: free(key->option_data); break; case RULE_OPTION_TYPE_IP_PROTO: free(key->option_data); break; case RULE_OPTION_TYPE_IP_SAME: /* Data is NULL, nothing to free */ break; case RULE_OPTION_TYPE_IP_TOS: free(key->option_data); break; case RULE_OPTION_TYPE_IS_DATA_AT: free(key->option_data); break; case RULE_OPTION_TYPE_CONTENT: case RULE_OPTION_TYPE_CONTENT_URI: PatternMatchFree(key->option_data); break; case RULE_OPTION_TYPE_PCRE: PcreFree(key->option_data); break; #ifdef ENABLE_REACT case RULE_OPTION_TYPE_REACT: ReactFree(key->option_data); break; #endif #ifdef ENABLE_RESPOND case RULE_OPTION_TYPE_RESPOND: free(key->option_data); break; #endif case RULE_OPTION_TYPE_RPC_CHECK: free(key->option_data); break; case RULE_OPTION_TYPE_SESSION: free(key->option_data); break; case RULE_OPTION_TYPE_TCP_ACK: free(key->option_data); break; case RULE_OPTION_TYPE_TCP_FLAG: free(key->option_data); break; case RULE_OPTION_TYPE_TCP_SEQ: free(key->option_data); break; case RULE_OPTION_TYPE_TCP_WIN: free(key->option_data); break; case RULE_OPTION_TYPE_TTL: free(key->option_data); break; case RULE_OPTION_TYPE_URILEN: free(key->option_data); break; #ifdef DYNAMIC_PLUGIN case RULE_OPTION_TYPE_HDR_OPT_CHECK: break; case RULE_OPTION_TYPE_PREPROCESSOR: PreprocessorRuleOptionsFreeFunc(key->option_data); break; case RULE_OPTION_TYPE_DYNAMIC: fpDynamicDataFree(key->option_data); break; #endif case RULE_OPTION_TYPE_LEAF_NODE: break; } return 0; }