dcerpc: use saturating_add to count fragments

And do not overflow if we have traffic with more than 65K fragments

(cherry picked from commit a48200b9e5)
pull/14600/head
Philippe Antoine 4 months ago committed by Shivani Bhardwaj
parent df389f8a43
commit c9b80e5aff

@ -172,7 +172,7 @@ impl DCERPCUDPState {
let max_size = cfg_max_stub_size() as usize;
match hdr.pkt_type {
DCERPC_TYPE_REQUEST => {
tx.frag_cnt_ts += 1;
tx.frag_cnt_ts = tx.frag_cnt_ts.saturating_add(1);
if input.len() + tx.stub_data_buffer_ts.len() < max_size {
tx.stub_data_buffer_ts.extend_from_slice(input);
} else if tx.stub_data_buffer_ts.len() < max_size {
@ -184,7 +184,7 @@ impl DCERPCUDPState {
return true;
}
DCERPC_TYPE_RESPONSE => {
tx.frag_cnt_tc += 1;
tx.frag_cnt_tc = tx.frag_cnt_tc.saturating_add(1);
if input.len() + tx.stub_data_buffer_tc.len() < max_size {
tx.stub_data_buffer_tc.extend_from_slice(input);
} else if tx.stub_data_buffer_tc.len() < max_size {

@ -205,7 +205,7 @@ pub fn smb_write_dcerpc_record(state: &mut SMBState,
SCLogDebug!("previous CMD {} found at tx {} => {:?}",
dcer.packet_type, tx.id, tx);
if let Some(SMBTransactionTypeData::DCERPC(ref mut tdn)) = tx.type_data {
tdn.frag_cnt_ts += 1;
tdn.frag_cnt_ts = tdn.frag_cnt_ts.saturating_add(1);
let max_size = cfg_max_stub_size() as usize;
if recr.data.len() + tdn.stub_data_ts.len() < max_size {
SCLogDebug!("additional frag of size {}", recr.data.len());
@ -247,7 +247,7 @@ pub fn smb_write_dcerpc_record(state: &mut SMBState,
SCLogDebug!("first frag size {}", recr.data.len());
tdn.opnum = recr.opnum;
tdn.context_id = recr.context_id;
tdn.frag_cnt_ts += 1;
tdn.frag_cnt_ts = tdn.frag_cnt_ts.saturating_add(1);
let max_size = cfg_max_stub_size() as usize;
if tdn.stub_data_ts.len() + recr.data.len() < max_size {
tdn.stub_data_ts.extend_from_slice(recr.data);
@ -418,7 +418,7 @@ fn dcerpc_response_handle(tx: &mut SMBTransaction,
SCLogDebug!("CMD 11 found at tx {}", tx.id);
tdn.set_result(DCERPC_TYPE_RESPONSE);
let max_size = cfg_max_stub_size() as usize;
tdn.frag_cnt_tc += 1;
tdn.frag_cnt_tc = tdn.frag_cnt_tc.saturating_add(1);
if tdn.stub_data_tc.len() + respr.data.len() < max_size {
tdn.stub_data_tc.extend_from_slice(respr.data);
} else if tdn.stub_data_tc.len() < max_size {

Loading…
Cancel
Save