file->log_file_event(flow, file_policy);
}
-FileFlows* FileFlows::get_file_flows(Flow* flow)
+FileFlows* FileFlows::get_file_flows(Flow* flow, bool to_create)
{
FileFlows* fd = (FileFlows*)flow->get_flow_data(FileFlows::file_flow_data_id);
- if (fd)
+ if (!to_create or fd)
return fd;
FileInspect* fi = (FileInspect*)InspectorManager::get_inspector(FILE_ID_NAME, true);
void handle_retransmit(Packet*) override;
// Factory method to get file flows
- static FileFlows* get_file_flows(Flow*);
+ static FileFlows* get_file_flows(Flow*, bool to_create=true);
static FilePolicyBase* get_file_policy(Flow*);
FileContext* get_current_file_context();
}
DCE2_Smb2FileTracker::DCE2_Smb2FileTracker(uint64_t file_id_v, DCE2_Smb2TreeTracker* ttr_v,
- DCE2_Smb2SessionTracker* str_v) : file_id(file_id_v), ttr(ttr_v), str(str_v)
+ DCE2_Smb2SessionTracker* str_v, Flow* flow_v) : file_id(file_id_v), ttr(ttr_v),
+ str(str_v), flow(flow_v)
{
debug_logf(dce_smb_trace, nullptr, "file tracker %" PRIu64 " created\n", file_id);
memory::MemoryCap::update_allocations(sizeof(*this));
debug_logf(dce_smb_trace, nullptr,
"file tracker %" PRIu64 " file name hash %" PRIu64 " terminating\n",
file_id, file_name_hash);
- FileFlows* file_flows = FileFlows::get_file_flows(DetectionEngine::get_current_packet()->flow);
+
+ FileFlows* file_flows = FileFlows::get_file_flows(flow, false);
if (file_flows)
{
file_flows->remove_processed_file_context(file_name_hash, file_id);
DCE2_Smb2FileTracker& operator=(const DCE2_Smb2FileTracker& arg) = delete;
DCE2_Smb2FileTracker(uint64_t file_id_v, DCE2_Smb2TreeTracker* ttr_v,
- DCE2_Smb2SessionTracker* str_v);
+ DCE2_Smb2SessionTracker* str_v, snort::Flow* flow_v);
~DCE2_Smb2FileTracker();
bool ignore = false;
DCE2_SmbPduState smb2_pdu_state;
DCE2_Smb2TreeTracker* ttr = nullptr;
DCE2_Smb2SessionTracker* str = nullptr;
+ snort::Flow *flow = nullptr;
};
typedef DCE2_DbMap<uint64_t, DCE2_Smb2FileTracker*, std::hash<uint64_t> > DCE2_DbMapFtracker;
DCE2_Smb2FileTracker* ftracker = ttr->findFtracker(fileId_persistent);
if (!ftracker)
{
- ftracker = new DCE2_Smb2FileTracker(fileId_persistent, ttr, str);
+ ftracker = new DCE2_Smb2FileTracker(fileId_persistent, ttr, str, DetectionEngine::get_current_packet()->flow);
ttr->insertFtracker(fileId_persistent, ftracker);
}
ftracker->file_name = rtracker->fname;
DCE2_Smb2FileTracker* ftracker = ttr->findFtracker(fileId_persistent);
if (!ftracker) // compounded create request + read request case
{
- ftracker = new DCE2_Smb2FileTracker(fileId_persistent, ttr, str);
+ ftracker = new DCE2_Smb2FileTracker(fileId_persistent, ttr, str, DetectionEngine::get_current_packet()->flow);
ttr->insertFtracker(fileId_persistent, ftracker);
}
DCE2_Smb2FileTracker* ftracker = ttr->findFtracker(fileId_persistent);
if (!ftracker) // compounded create request + write request case
{
- ftracker = new DCE2_Smb2FileTracker(fileId_persistent, ttr, str);
+ ftracker = new DCE2_Smb2FileTracker(fileId_persistent, ttr, str, DetectionEngine::get_current_packet()->flow);
ttr->insertFtracker(fileId_persistent, ftracker);
}
if (!ftracker->ignore) // file tracker can not be nullptr here