]> git.ipfire.org Git - thirdparty/snort3.git/commitdiff
Merge pull request #1063 in SNORT/snort3 from file_config to master
authorHui Cao (huica) <huica@cisco.com>
Wed, 8 Nov 2017 19:11:03 +0000 (14:11 -0500)
committerHui Cao (huica) <huica@cisco.com>
Wed, 8 Nov 2017 19:11:03 +0000 (14:11 -0500)
Squashed commit of the following:

commit 44272839902cf52fd831d84d487d564c4a3b534a
Author: huica <huica@cisco.com>
Date:   Wed Nov 8 13:13:39 2017 -0500

    add back the ref count for file config

src/file_api/file_flows.cc
src/file_api/file_flows.h
src/file_api/file_lib.cc
src/file_api/file_lib.h
src/file_api/file_segment.cc
src/file_api/file_segment.h

index 9b8edcbbccf5ed9278bdbe1b876294f2b3ed6fe0..e5b4ace63497b0647d13557c385cfc01970abae7 100644 (file)
@@ -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);
     }
 }
 
index 7da42962be183e41814fca177da9b8642e455786..7e651e466ca494462e2821f58d85b4e072431e17 100644 (file)
 #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;
 };
 
index a7a719a739f1a410b49be998bb79c7abb3568180..5116c8244ce4e8077cd178969f976f23bcd5e973 100644 (file)
@@ -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)
index 408b29fa957a8ef0a959cc6181a62bf1bfd31478..05673dfa66d6144590b2297d296c074fb1a7fe0d 100644 (file)
@@ -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
index fbe698e0fd2109edd3004d0f1d846c85e1aa0378..041815c29e72d09d10c739a99f643ed333386d6a 100644 (file)
@@ -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))
     {
index ae858448341aba98d9f705cbc88b693a0772cd67..64b6329760083948b740254069baa9bbcb4ebab9 100644 (file)
@@ -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