FileConfig* fc = fi->config;
if (fc and fd)
{
- fd->set_file_config(fc);
fd->set_file_policy(&(fc->get_file_policy()));
}
{
/* 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);
}
/*
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)
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);
}
}
#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
{
//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; }
uint64_t current_file_id = 0;
bool gen_signature = false;
Flow* flow = nullptr;
- FileConfig* file_config = nullptr;
FilePolicyBase* file_policy = nullptr;
};
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 ()
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;
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() )
break;
}
if ( config->trace_type )
- print(std::cout, config);
+ print(std::cout);
}
}
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())
{
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()]++;
}
* 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,
/*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)
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);
}
}
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;
/*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
{
}
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);
}
/*
* 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;
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)
{
}
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)
{
}
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)
{
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)
// 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);
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:
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
}
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;
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)
{
* 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;
// 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)
{
return 0;
}
- ret = process_all(flow, config, policy);
+ ret = process_all(flow, policy);
}
else if ((current_offset < context->get_file_size()) && (current_offset < offset))
{
// 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;
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