}
static inline bool DCE2_Smb2FindSidTid(DCE2_Smb2SsnData* ssd, const uint64_t sid,
- const uint32_t tid, DCE2_Smb2SessionTracker** str, DCE2_Smb2TreeTracker** ttr)
+ const uint32_t tid, const uint32_t mid, DCE2_Smb2SessionTracker** str, DCE2_Smb2TreeTracker** ttr)
{
*str = DCE2_Smb2FindSidInSsd(ssd, sid);
if (!*str)
return false;
-
- *ttr = (*str)->findTtracker(tid);
- if (!*ttr)
+
+ if(!tid)
+ *ttr = find_tree_for_message(*str, mid);
+ else
+ *ttr = (*str)->findTtracker(tid);
+
+ if(!*ttr)
return false;
return true;
break;
case SMB2_COM_READ:
dce2_smb_stats.v2_read++;
- if (!DCE2_Smb2FindSidTid(ssd, sid, tid, &str, &ttr) or
+ if (!DCE2_Smb2FindSidTid(ssd, sid, tid, mid, &str, &ttr) or
SMB2_SHARE_TYPE_DISK != ttr->get_share_type())
{
dce2_smb_stats.v2_read_ignored++;
break;
case SMB2_COM_WRITE:
dce2_smb_stats.v2_wrt++;
- if (!DCE2_Smb2FindSidTid(ssd, sid, tid, &str, &ttr) or
+ if (!DCE2_Smb2FindSidTid(ssd, sid, tid, mid, &str, &ttr) or
SMB2_SHARE_TYPE_DISK != ttr->get_share_type())
{
dce2_smb_stats.v2_wrt_ignored++;
break;
case SMB2_COM_SET_INFO:
dce2_smb_stats.v2_stinf++;
- if (!DCE2_Smb2FindSidTid(ssd, sid, tid, &str, &ttr) or
+ if (!DCE2_Smb2FindSidTid(ssd, sid, tid, mid, &str, &ttr) or
SMB2_SHARE_TYPE_DISK != ttr->get_share_type())
{
dce2_smb_stats.v2_stinf_ignored++;
break;
case SMB2_COM_CLOSE:
dce2_smb_stats.v2_cls++;
- if (!DCE2_Smb2FindSidTid(ssd, sid, tid, &str, &ttr) or
+ if (!DCE2_Smb2FindSidTid(ssd, sid, tid, mid, &str, &ttr) or
SMB2_SHARE_TYPE_DISK != ttr->get_share_type())
{
dce2_smb_stats.v2_cls_ignored++;
break;
case SMB2_COM_TREE_DISCONNECT:
dce2_smb_stats.v2_tree_discn++;
- if (!DCE2_Smb2FindSidTid(ssd, sid, tid, &str, &ttr))
+ if (!DCE2_Smb2FindSidTid(ssd, sid, tid, mid, &str, &ttr))
{
dce2_smb_stats.v2_tree_discn_ignored++;
return;
}
}
+DCE2_Smb2TreeTracker *find_tree_for_message(DCE2_Smb2SessionTracker *str, const uint64_t mid)
+{
+ auto all_tree_trackers = str->tree_trackers.get_all_entry();
+ for ( auto& h : all_tree_trackers )
+ {
+ if(h.second->findRtracker(mid))
+ return h.second;
+ }
+ return nullptr;
+}
+
bool DCE2_Smb2ProcessFileData(DCE2_Smb2SsnData* ssd, const uint8_t* file_data,
uint32_t data_size)
{
smb_data, end, SMB2_CREATE_RESPONSE_STRUC_SIZE - 1,
dce2_smb_stats.v2_crt_resp_hdr_err, SMB2_COM_CREATE)
+ if(!tid)
+ ttr = find_tree_for_message(str, mid);
if (!ttr)
{
debug_logf(dce_smb_trace, DetectionEngine::get_current_packet(),