diff options
-rw-r--r-- | example/ndpiReader.c | 61 | ||||
-rw-r--r-- | example/reader_util.c | 57 | ||||
-rw-r--r-- | fuzz/Makefile.am | 4 | ||||
-rw-r--r-- | fuzz/fuzz_ndpi_reader.c | 12 | ||||
-rw-r--r-- | fuzz/fuzz_readerutils_parseprotolist.cpp | 4 | ||||
-rw-r--r-- | fuzz/fuzz_readerutils_workflow.cpp | 4 |
6 files changed, 50 insertions, 92 deletions
diff --git a/example/ndpiReader.c b/example/ndpiReader.c index 5685cda9a..c516d9b13 100644 --- a/example/ndpiReader.c +++ b/example/ndpiReader.c @@ -135,9 +135,9 @@ extern u_int32_t max_num_packets_per_flow, max_packet_payload_dissection, max_nu extern u_int16_t min_pattern_len, max_pattern_len; u_int8_t dump_internal_stats; -struct ndpi_bin malloc_bins; -int enable_malloc_bins = 0; -int max_malloc_bins = 14; +static struct ndpi_bin malloc_bins; +static int enable_malloc_bins = 0; +static int max_malloc_bins = 14; int malloc_size_stats = 0; struct flow_info { @@ -252,7 +252,7 @@ typedef struct ndpi_id { } ndpi_id_t; // used memory counters -u_int32_t current_ndpi_memory = 0, max_ndpi_memory = 0; +static u_int32_t current_ndpi_memory = 0, max_ndpi_memory = 0; #ifdef USE_DPDK static int dpdk_port_id = 0, dpdk_run_capture = 1; #endif @@ -270,7 +270,45 @@ extern int parse_proto_name_list(char *str, NDPI_PROTOCOL_BITMASK *bitmask, int FILE *trace = NULL; #endif -/* ********************************** */ +/* ***************************************************** */ + +static u_int32_t reader_slot_malloc_bins(u_int64_t v) +{ + int i; + + /* 0-2,3-4,5-8,9-16,17-32,33-64,65-128,129-256,257-512,513-1024,1025-2048,2049-4096,4097-8192,8193- */ + for(i=0; i < max_malloc_bins - 1; i++) + if((1ULL << (i + 1)) >= v) + return i; + return i; +} + +/** + * @brief ndpi_malloc wrapper function + */ +static void *ndpi_malloc_wrapper(size_t size) { + current_ndpi_memory += size; + + if(current_ndpi_memory > max_ndpi_memory) + max_ndpi_memory = current_ndpi_memory; + + if(enable_malloc_bins && malloc_size_stats) + ndpi_inc_bin(&malloc_bins, reader_slot_malloc_bins(size), 1); + + return(malloc(size)); /* Don't change to ndpi_malloc !!!!! */ +} + +/* ***************************************************** */ + +/** + * @brief free wrapper function + */ +static void free_wrapper(void *freeable) { + free(freeable); /* Don't change to ndpi_free !!!!! */ +} + +/* ***************************************************** */ + #define NUM_DOH_BINS 2 @@ -2820,16 +2858,6 @@ static void setupDetection(u_int16_t thread_id, pcap_t * pcap_handle) { /* Make sure to load lists before finalizing the initialization */ ndpi_set_protocol_detection_bitmask2(ndpi_thread_info[thread_id].workflow->ndpi_struct, &enabled_bitmask); - // clear memory for results - memset(ndpi_thread_info[thread_id].workflow->stats.protocol_counter, 0, - sizeof(ndpi_thread_info[thread_id].workflow->stats.protocol_counter)); - memset(ndpi_thread_info[thread_id].workflow->stats.protocol_counter_bytes, 0, - sizeof(ndpi_thread_info[thread_id].workflow->stats.protocol_counter_bytes)); - memset(ndpi_thread_info[thread_id].workflow->stats.protocol_flows, 0, - sizeof(ndpi_thread_info[thread_id].workflow->stats.protocol_flows)); - memset(ndpi_thread_info[thread_id].workflow->stats.flow_confidence, 0, - sizeof(ndpi_thread_info[thread_id].workflow->stats.flow_confidence)); - if(_protoFilePath != NULL) ndpi_load_protocols_file(ndpi_thread_info[thread_id].workflow->ndpi_struct, _protoFilePath); @@ -4631,6 +4659,9 @@ void test_lib() { long thread_id; #endif + set_ndpi_malloc(ndpi_malloc_wrapper), set_ndpi_free(free_wrapper); + set_ndpi_flow_malloc(NULL), set_ndpi_flow_free(NULL); + #ifdef DEBUG_TRACE if(trace) fprintf(trace, "Num threads: %d\n", num_threads); #endif diff --git a/example/reader_util.c b/example/reader_util.c index 0fe629ac6..e666e4690 100644 --- a/example/reader_util.c +++ b/example/reader_util.c @@ -81,9 +81,6 @@ static u_int32_t flow_id = 0; u_int8_t enable_doh_dot_detection = 0; extern int malloc_size_stats; -extern struct ndpi_bin malloc_bins; -extern int max_malloc_bins; -extern int enable_malloc_bins; /* ****************************************************** */ @@ -335,45 +332,6 @@ void ndpi_free_flow_info_half(struct ndpi_flow_info *flow) { /* ***************************************************** */ -extern u_int32_t current_ndpi_memory, max_ndpi_memory; - -static u_int32_t __slot_malloc_bins(u_int64_t v) -{ - int i; - - /* 0-2,3-4,5-8,9-16,17-32,33-64,65-128,129-256,257-512,513-1024,1025-2048,2049-4096,4097-8192,8193- */ - for(i=0; i < max_malloc_bins - 1; i++) - if((1ULL << (i + 1)) >= v) - return i; - return i; -} - -/** - * @brief ndpi_malloc wrapper function - */ -static void *ndpi_malloc_wrapper(size_t size) { - current_ndpi_memory += size; - - if(current_ndpi_memory > max_ndpi_memory) - max_ndpi_memory = current_ndpi_memory; - - if(enable_malloc_bins && malloc_size_stats) - ndpi_inc_bin(&malloc_bins, __slot_malloc_bins(size), 1); - - return(malloc(size)); /* Don't change to ndpi_malloc !!!!! */ -} - -/* ***************************************************** */ - -/** - * @brief free wrapper function - */ -static void free_wrapper(void *freeable) { - free(freeable); /* Don't change to ndpi_free !!!!! */ -} - -/* ***************************************************** */ - static uint16_t ndpi_get_proto_id(struct ndpi_detection_module_struct *ndpi_mod, const char *name) { uint16_t proto_id; char *e; @@ -454,13 +412,6 @@ struct ndpi_workflow* ndpi_workflow_init(const struct ndpi_workflow_prefs * pref struct ndpi_detection_module_struct * module; struct ndpi_workflow * workflow; - /* On some fuzzers we don't want to use these memory allocators, but some custom ones */ -#ifndef DISABLE_CUSTOM_ALLOCATOR_ON_READERUTILS - set_ndpi_malloc(ndpi_malloc_wrapper), set_ndpi_free(free_wrapper); - set_ndpi_flow_malloc(NULL), set_ndpi_flow_free(NULL); -#endif - - /* TODO: just needed here to init ndpi ndpi_malloc wrapper */ module = ndpi_init_detection_module(); if(module == NULL) { @@ -1714,17 +1665,11 @@ static struct ndpi_proto packet_processing(struct ndpi_workflow * workflow, if(enough_packets || (flow->detected_protocol.app_protocol != NDPI_PROTOCOL_UNKNOWN)) { if((!enough_packets) && ndpi_extra_dissection_possible(workflow->ndpi_struct, ndpi_flow)) - ; /* Wait for certificate fingerprint */ + ; /* Wait for further metadata */ else { /* New protocol detected or give up */ flow->detection_completed = 1; -#if 0 - /* Check if we should keep checking extra packets */ - if(ndpi_flow && ndpi_flow->check_extra_packets) - flow->check_extra_packets = 1; -#endif - if(flow->detected_protocol.app_protocol == NDPI_PROTOCOL_UNKNOWN) { u_int8_t proto_guessed; diff --git a/fuzz/Makefile.am b/fuzz/Makefile.am index 8353cae49..a0cfc501c 100644 --- a/fuzz/Makefile.am +++ b/fuzz/Makefile.am @@ -577,8 +577,8 @@ fuzz_filecfg_config_LINK=$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(fuzz_filecfg_config_LDFLAGS) @NDPI_LDFLAGS@ $(LDFLAGS) -o $@ fuzz_readerutils_workflow_SOURCES = fuzz_readerutils_workflow.cpp fuzz_common_code.c ../example/reader_util.c -fuzz_readerutils_workflow_CXXFLAGS = -I../example/ @NDPI_CFLAGS@ $(CXXFLAGS) -DDISABLE_CUSTOM_ALLOCATOR_ON_READERUTILS -fuzz_readerutils_workflow_CFLAGS = @NDPI_CFLAGS@ $(CXXFLAGS) -DDISABLE_CUSTOM_ALLOCATOR_ON_READERUTILS +fuzz_readerutils_workflow_CXXFLAGS = -I../example/ @NDPI_CFLAGS@ $(CXXFLAGS) +fuzz_readerutils_workflow_CFLAGS = @NDPI_CFLAGS@ $(CXXFLAGS) fuzz_readerutils_workflow_LDADD = ../src/lib/libndpi.a $(ADDITIONAL_LIBS) fuzz_readerutils_workflow_LDFLAGS = $(PCAP_LIB) $(LIBS) if HAS_FUZZLDFLAGS diff --git a/fuzz/fuzz_ndpi_reader.c b/fuzz/fuzz_ndpi_reader.c index 76da3c5ff..7b0268eed 100644 --- a/fuzz/fuzz_ndpi_reader.c +++ b/fuzz/fuzz_ndpi_reader.c @@ -11,15 +11,11 @@ struct ndpi_workflow_prefs *prefs = NULL; struct ndpi_workflow *workflow = NULL; -u_int32_t current_ndpi_memory = 0, max_ndpi_memory = 0; u_int8_t enable_payload_analyzer = 0; u_int8_t enable_flow_stats = 1; u_int8_t human_readeable_string_len = 5; u_int8_t max_num_udp_dissected_pkts = 16 /* 8 is enough for most protocols, Signal requires more */, max_num_tcp_dissected_pkts = 80 /* due to telnet */; -int enable_malloc_bins = 1; int malloc_size_stats = 0; -int max_malloc_bins = 14; -struct ndpi_bin malloc_bins; /* unused */ extern void ndpi_report_payload_stats(FILE *out); @@ -71,12 +67,6 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { ndpi_set_config(workflow->ndpi_struct, NULL, "tcp_ack_payload_heuristic", "1"); ndpi_set_config(workflow->ndpi_struct, "tls", "application_blocks_tracking", "1"); - memset(workflow->stats.protocol_counter, 0, - sizeof(workflow->stats.protocol_counter)); - memset(workflow->stats.protocol_counter_bytes, 0, - sizeof(workflow->stats.protocol_counter_bytes)); - memset(workflow->stats.protocol_flows, 0, - sizeof(workflow->stats.protocol_flows)); ndpi_finalize_initialization(workflow->ndpi_struct); #ifdef CRYPT_FORCE_NO_AESNI @@ -139,7 +129,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) { for(i = 0; i < workflow->prefs.num_roots; i++) ndpi_tdestroy(workflow->ndpi_flows_root[i], ndpi_flow_info_freer); ndpi_free(workflow->ndpi_flows_root); - /* Free payload analyzer data, without printing */ + /* Free payload analyzer data */ if(enable_payload_analyzer) ndpi_report_payload_stats(stdout); diff --git a/fuzz/fuzz_readerutils_parseprotolist.cpp b/fuzz/fuzz_readerutils_parseprotolist.cpp index f4e7f0485..2a52cef75 100644 --- a/fuzz/fuzz_readerutils_parseprotolist.cpp +++ b/fuzz/fuzz_readerutils_parseprotolist.cpp @@ -6,15 +6,11 @@ #include <stdio.h> #include "fuzzer/FuzzedDataProvider.h" -u_int32_t current_ndpi_memory = 0, max_ndpi_memory = 0; u_int8_t enable_payload_analyzer = 0; u_int8_t enable_flow_stats = 0; u_int8_t human_readeable_string_len = 5; u_int8_t max_num_udp_dissected_pkts = 16 /* 8 is enough for most protocols, Signal requires more */, max_num_tcp_dissected_pkts = 80 /* due to telnet */; -int enable_malloc_bins = 0; int malloc_size_stats = 0; -int max_malloc_bins = 14; -struct ndpi_bin malloc_bins; /* unused */ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { diff --git a/fuzz/fuzz_readerutils_workflow.cpp b/fuzz/fuzz_readerutils_workflow.cpp index d4d747374..a3aea2e11 100644 --- a/fuzz/fuzz_readerutils_workflow.cpp +++ b/fuzz/fuzz_readerutils_workflow.cpp @@ -8,15 +8,11 @@ extern u_int8_t enable_doh_dot_detection; -u_int32_t current_ndpi_memory = 0, max_ndpi_memory = 0; u_int8_t enable_payload_analyzer = 0; u_int8_t enable_flow_stats = 0; u_int8_t human_readeable_string_len = 5; u_int8_t max_num_udp_dissected_pkts = 16 /* 8 is enough for most protocols, Signal requires more */, max_num_tcp_dissected_pkts = 80 /* due to telnet */; -int enable_malloc_bins = 0; int malloc_size_stats = 0; -int max_malloc_bins = 14; -struct ndpi_bin malloc_bins; /* unused */ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { FuzzedDataProvider fuzzed_data(data, size); |