From: Hui Cao (huica) Date: Wed, 8 Nov 2017 19:11:03 +0000 (-0500) Subject: Merge pull request #1063 in SNORT/snort3 from file_config to master X-Git-Tag: 3.0.0-241~22 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7700a96764d0865e43d78cd6f89fb6382e2af58c;p=thirdparty%2Fsnort3.git Merge pull request #1063 in SNORT/snort3 from file_config to master Squashed commit of the following: commit 44272839902cf52fd831d84d487d564c4a3b534a Author: huica Date: Wed Nov 8 13:13:39 2017 -0500 add back the ref count for file config --- diff --git a/src/file_api/file_flows.cc b/src/file_api/file_flows.cc index 9b8edcbbc..e5b4ace63 100644 --- a/src/file_api/file_flows.cc +++ b/src/file_api/file_flows.cc @@ -61,7 +61,6 @@ FileFlows* FileFlows::get_file_flows(Flow* flow) FileConfig* fc = fi->config; if (fc and fd) { - fd->set_file_config(fc); fd->set_file_policy(&(fc->get_file_policy())); } @@ -191,12 +190,11 @@ bool FileFlows::file_process(uint64_t file_id, const uint8_t* file_data, { /* Just check file type and signature */ FilePosition position = SNORT_FILE_FULL; - return context->process(flow, file_data, data_size, position, - file_config, file_policy); + return context->process(flow, file_data, data_size, position, file_policy); } } - return context->process(flow, file_data, data_size, offset, file_config, file_policy); + return context->process(flow, file_data, data_size, offset, file_policy); } /* @@ -221,7 +219,7 @@ bool FileFlows::file_process(const uint8_t* file_data, int data_size, set_current_file_context(context); context->set_signature_state(gen_signature); - return context->process(flow, file_data, data_size, position, file_config, file_policy); + return context->process(flow, file_data, data_size, position, file_policy); } void FileFlows::set_file_name(const uint8_t* fname, uint32_t name_size) @@ -235,7 +233,7 @@ void FileFlows::set_file_name(const uint8_t* fname, uint32_t name_size) if (fname and name_size) context->set_file_name((const char*)fname, name_size); - context->log_file_event(flow, file_config); + context->log_file_event(flow); } } diff --git a/src/file_api/file_flows.h b/src/file_api/file_flows.h index 7da42962b..7e651e466 100644 --- a/src/file_api/file_flows.h +++ b/src/file_api/file_flows.h @@ -27,13 +27,11 @@ #include "main/snort_types.h" #include "file_api.h" -#include "file_config.h" #include "file_module.h" #include "file_policy.h" class FileContext; class Flow; -class FileConfig; class FileInspect : public Inspector { @@ -85,8 +83,6 @@ public: //void handle_retransmit(Packet*) override; static unsigned file_flow_data_id; - void set_file_config(FileConfig* fc) { file_config = fc; } - void set_file_policy(FilePolicyBase* fp) { file_policy = fp; } FilePolicyBase* get_file_policy() { return file_policy; } @@ -100,7 +96,6 @@ private: uint64_t current_file_id = 0; bool gen_signature = false; Flow* flow = nullptr; - FileConfig* file_config = nullptr; FilePolicyBase* file_policy = nullptr; }; diff --git a/src/file_api/file_lib.cc b/src/file_api/file_lib.cc index a7a719a73..5116c8244 100644 --- a/src/file_api/file_lib.cc +++ b/src/file_api/file_lib.cc @@ -253,6 +253,8 @@ FileContext::FileContext () file_signature_context = nullptr; file_capture = nullptr; file_segments = nullptr; + inspector = (FileInspect*)InspectorManager::acquire(FILE_ID_NAME, SnortConfig::get_conf()); + config = inspector->config; } FileContext::~FileContext () @@ -263,10 +265,11 @@ FileContext::~FileContext () stop_file_capture(); if (file_segments) delete file_segments; + InspectorManager::release(inspector); } inline int FileContext::get_data_size_from_depth_limit(FileProcessType type, int - data_size, FileConfig* config) + data_size) { uint64_t max_depth; @@ -298,7 +301,7 @@ inline void FileContext::finalize_file_type() file_type_context = nullptr; } -void FileContext::log_file_event(Flow* flow, FileConfig* config) +void FileContext::log_file_event(Flow* flow) { // wait for file name is set to log file event if ( is_file_name_set() ) @@ -322,7 +325,7 @@ void FileContext::log_file_event(Flow* flow, FileConfig* config) break; } if ( config->trace_type ) - print(std::cout, config); + print(std::cout); } } @@ -339,8 +342,7 @@ FileVerdict FileContext::file_signature_lookup(Flow* flow) return FILE_VERDICT_UNKNOWN; } -void FileContext::finish_signature_lookup(Flow* flow, bool final_lookup, - FileConfig* config, FilePolicyBase* policy) +void FileContext::finish_signature_lookup(Flow* flow, bool final_lookup, FilePolicyBase* policy) { if (get_file_sig_sha256()) { @@ -348,7 +350,7 @@ void FileContext::finish_signature_lookup(Flow* flow, bool final_lookup, FileVerdict verdict = policy->signature_lookup(flow, this); if ( verdict != FILE_VERDICT_UNKNOWN || final_lookup ) { - log_file_event(flow, config); + log_file_event(flow); config_file_signature(false); file_stats->signatures_processed[get_file_type()][get_file_direction()]++; } @@ -389,8 +391,9 @@ void FileContext::check_policy(Flow* flow, FileDirection dir, FilePolicyBase* po * false: ignore this file */ bool FileContext::process(Flow* flow, const uint8_t* file_data, int data_size, - FilePosition position, FileConfig* config, FilePolicyBase* policy) + FilePosition position, FilePolicyBase* policy) { + if ( config->trace_stream ) { FileContext::print_file_data(stdout, file_data, data_size, @@ -412,7 +415,7 @@ bool FileContext::process(Flow* flow, const uint8_t* file_data, int data_size, /*file type id*/ if (is_file_type_enabled()) { - process_file_type(file_data, data_size, position, config); + process_file_type(file_data, data_size, position); /*Don't care unknown file type*/ if (get_file_type() == SNORT_FILE_TYPE_UNKNOWN) @@ -430,7 +433,7 @@ bool FileContext::process(Flow* flow, const uint8_t* file_data, int data_size, file_stats->files_processed[get_file_type()][get_file_direction()]++; //Check file type based on file policy policy->type_lookup(flow, this); - log_file_event(flow, config); + log_file_event(flow); } } @@ -438,7 +441,7 @@ bool FileContext::process(Flow* flow, const uint8_t* file_data, int data_size, if (is_file_signature_enabled()) { if (!sha256) - process_file_signature_sha256(file_data, data_size, position, config); + process_file_signature_sha256(file_data, data_size, position); file_stats->data_processed[get_file_type()][get_file_direction()] += data_size; @@ -451,10 +454,10 @@ bool FileContext::process(Flow* flow, const uint8_t* file_data, int data_size, /*Fails to capture, when out of memory or size limit, need lookup*/ if (is_file_capture_enabled()) { - process_file_capture(file_data, data_size, position, config); + process_file_capture(file_data, data_size, position); } - finish_signature_lookup(flow, ( file_state.sig_state != FILE_SIG_FLUSH ), config, policy); + finish_signature_lookup(flow, ( file_state.sig_state != FILE_SIG_FLUSH ), policy); } else { @@ -465,11 +468,11 @@ bool FileContext::process(Flow* flow, const uint8_t* file_data, int data_size, } bool FileContext::process(Flow* flow, const uint8_t* file_data, int data_size, - uint64_t offset, FileConfig* config, FilePolicyBase* policy) + uint64_t offset, FilePolicyBase* policy) { if (!file_segments) file_segments = new FileSegments(this); - return file_segments->process(flow, file_data, data_size, offset, config, policy); + return file_segments->process(flow, file_data, data_size, offset, policy); } /* @@ -482,8 +485,7 @@ bool FileContext::process(Flow* flow, const uint8_t* file_data, int data_size, * 3) file magics are exhausted in depth * */ -void FileContext::process_file_type(const uint8_t* file_data, int size, FilePosition position, - FileConfig* config) +void FileContext::process_file_type(const uint8_t* file_data, int size, FilePosition position) { int data_size; @@ -492,7 +494,7 @@ void FileContext::process_file_type(const uint8_t* file_data, int size, FilePosi return; /* Check whether file type depth is reached*/ - data_size = get_data_size_from_depth_limit(SNORT_FILE_TYPE_ID, size, config); + data_size = get_data_size_from_depth_limit(SNORT_FILE_TYPE_ID, size); if (data_size < 0) { @@ -512,9 +514,9 @@ void FileContext::process_file_type(const uint8_t* file_data, int size, FilePosi } void FileContext::process_file_signature_sha256(const uint8_t* file_data, int size, - FilePosition position, FileConfig* config) + FilePosition position) { - int data_size = get_data_size_from_depth_limit(SNORT_FILE_SHA256, size, config); + int data_size = get_data_size_from_depth_limit(SNORT_FILE_SHA256, size); if (data_size != size) { @@ -582,7 +584,7 @@ void FileContext::process_file_signature_sha256(const uint8_t* file_data, int si } FileCaptureState FileContext::process_file_capture(const uint8_t* file_data, - int data_size, FilePosition position, FileConfig* config) + int data_size, FilePosition position) { if (!file_capture) { @@ -742,7 +744,7 @@ void FileContext::print_file_name(std::ostream& log) snort_free(outbuf); } -void FileContext::print(std::ostream& log, FileConfig* config) +void FileContext::print(std::ostream& log) { print_file_name(log); log << "File type: " << config->file_type_name(file_type_id) diff --git a/src/file_api/file_lib.h b/src/file_api/file_lib.h index 408b29fa9..05673dfa6 100644 --- a/src/file_api/file_lib.h +++ b/src/file_api/file_lib.h @@ -107,19 +107,14 @@ public: // Return: // true: continue processing/log/block this file // false: ignore this file - bool process(Flow*, const uint8_t* file_data, int data_size, FilePosition, - FileConfig*, FilePolicyBase*); - bool process(Flow*, const uint8_t* file_data, int data_size, uint64_t offset, - FileConfig*, FilePolicyBase*); - void process_file_type(const uint8_t* file_data, int data_size, FilePosition, - FileConfig*); - void process_file_signature_sha256(const uint8_t* file_data, int data_size, - FilePosition, FileConfig*); + bool process(Flow*, const uint8_t* file_data, int data_size, FilePosition, FilePolicyBase*); + bool process(Flow*, const uint8_t* file_data, int data_size, uint64_t offset, FilePolicyBase*); + void process_file_type(const uint8_t* file_data, int data_size, FilePosition); + void process_file_signature_sha256(const uint8_t* file_data, int data_size, FilePosition); void update_file_size(int data_size, FilePosition position); void stop_file_capture(); - FileCaptureState process_file_capture(const uint8_t* file_data, int data_size, - FilePosition, FileConfig*); - void log_file_event(Flow*, FileConfig*); + FileCaptureState process_file_capture(const uint8_t* file_data, int data_size, FilePosition); + void log_file_event(Flow*); FileVerdict file_signature_lookup(Flow*); void set_signature_state(bool gen_sig); @@ -130,7 +125,7 @@ public: void print_file_sha256(std::ostream&); void print_file_name(std::ostream&); static void print_file_data(FILE* fp, const uint8_t* data, int len, int max_depth); - void print(std::ostream&, FileConfig*); + void print(std::ostream&); char* get_UTF8_fname(size_t* converted_len); private: @@ -138,11 +133,12 @@ private: void* file_type_context; void* file_signature_context; FileSegments* file_segments; + FileInspect* inspector; + FileConfig* config; - inline int get_data_size_from_depth_limit(FileProcessType type, int data_size, - FileConfig*); + inline int get_data_size_from_depth_limit(FileProcessType type, int data_size); inline void finalize_file_type(); - inline void finish_signature_lookup(Flow*, bool, FileConfig*, FilePolicyBase*); + inline void finish_signature_lookup(Flow*, bool, FilePolicyBase*); }; #endif diff --git a/src/file_api/file_segment.cc b/src/file_api/file_segment.cc index fbe698e0f..041815c29 100644 --- a/src/file_api/file_segment.cc +++ b/src/file_api/file_segment.cc @@ -151,14 +151,14 @@ FilePosition FileSegments::get_file_position(uint64_t data_size, uint64_t file_s } int FileSegments::process_one(Flow* flow, const uint8_t* file_data, int data_size, - FileConfig* config, FilePolicyBase* policy) + FilePolicyBase* policy) { FilePosition position = get_file_position(data_size, context->get_file_size()); - return context->process(flow, file_data, data_size, position, config, policy); + return context->process(flow, file_data, data_size, position, policy); } -int FileSegments::process_all(Flow* flow, FileConfig* config, FilePolicyBase* policy) +int FileSegments::process_all(Flow* flow, FilePolicyBase* policy) { int ret = 1; @@ -166,7 +166,7 @@ int FileSegments::process_all(Flow* flow, FileConfig* config, FilePolicyBase* po while (current_segment && (current_offset == current_segment->offset)) { ret = process_one(flow, (const uint8_t*)current_segment->data->data(), - current_segment->data->size(), config, policy); + current_segment->data->size(), policy); if (!ret) { @@ -191,7 +191,7 @@ int FileSegments::process_all(Flow* flow, FileConfig* config, FilePolicyBase* po * 0: ignore this file */ int FileSegments::process(Flow* flow, const uint8_t* file_data, uint64_t data_size, - uint64_t offset, FileConfig* config, FilePolicyBase* policy) + uint64_t offset, FilePolicyBase* policy) { int ret = 0; @@ -203,7 +203,7 @@ int FileSegments::process(Flow* flow, const uint8_t* file_data, uint64_t data_si // Walk through the segments that can be flushed if (current_offset == offset) { - ret = process_one(flow, file_data, data_size, config, policy); + ret = process_one(flow, file_data, data_size, policy); current_offset += data_size; if (!ret) { @@ -211,7 +211,7 @@ int FileSegments::process(Flow* flow, const uint8_t* file_data, uint64_t data_si return 0; } - ret = process_all(flow, config, policy); + ret = process_all(flow, policy); } else if ((current_offset < context->get_file_size()) && (current_offset < offset)) { diff --git a/src/file_api/file_segment.h b/src/file_api/file_segment.h index ae8584483..64b632976 100644 --- a/src/file_api/file_segment.h +++ b/src/file_api/file_segment.h @@ -52,7 +52,7 @@ public: // Process file segments with current_offset specified. If file segment is out of order, // it will be put into the file segments queue. int process(Flow*, const uint8_t* file_data, uint64_t data_size, uint64_t offset, - FileConfig*, FilePolicyBase*); + FilePolicyBase*); private: FileSegment* head = nullptr; @@ -61,9 +61,8 @@ private: void add(const uint8_t* file_data, uint64_t data_size, uint64_t offset); FilePosition get_file_position(uint64_t data_size, uint64_t file_size); - int process_one(Flow*, const uint8_t* file_data, int data_size, FileConfig*, - FilePolicyBase*); - int process_all(Flow*, FileConfig*, FilePolicyBase*); + int process_one(Flow*, const uint8_t* file_data, int data_size, FilePolicyBase*); + int process_all(Flow*, FilePolicyBase*); }; #endif