smb: file handling cleanups

pull/8421/head
Victor Julien 4 years ago
parent d57510a10f
commit 33f6a16290

@ -55,14 +55,30 @@ pub fn filetracker_newchunk(ft: &mut FileTransferTracker, files: &mut FileContai
flags: u16, name: &[u8], data: &[u8], flags: u16, name: &[u8], data: &[u8],
chunk_offset: u64, chunk_size: u32, is_last: bool, xid: &u32) chunk_offset: u64, chunk_size: u32, is_last: bool, xid: &u32)
{ {
match unsafe {SURICATA_SMB_FILE_CONFIG} { if let Some(sfcm) = unsafe { SURICATA_SMB_FILE_CONFIG } {
Some(sfcm) => {
ft.new_chunk(sfcm, files, flags, name, data, chunk_offset, ft.new_chunk(sfcm, files, flags, name, data, chunk_offset,
chunk_size, 0, is_last, xid); } chunk_size, 0, is_last, xid);
None => panic!("no SURICATA_SMB_FILE_CONFIG"),
} }
} }
pub fn filetracker_trunc(ft: &mut FileTransferTracker, files: &mut FileContainer,
flags: u16)
{
ft.trunc(files, flags);
}
pub fn filetracker_close(ft: &mut FileTransferTracker, files: &mut FileContainer,
flags: u16)
{
ft.close(files, flags);
}
fn filetracker_update(ft: &mut FileTransferTracker, files: &mut FileContainer,
flags: u16, data: &[u8], gap_size: u32) -> u32
{
ft.update(files, flags, data, gap_size)
}
impl SMBState { impl SMBState {
pub fn new_file_tx(&mut self, fuid: &[u8], file_name: &[u8], direction: Direction) pub fn new_file_tx(&mut self, fuid: &[u8], file_name: &[u8], direction: Direction)
-> &mut SMBTransaction -> &mut SMBTransaction
@ -185,7 +201,7 @@ impl SMBState {
let queued_data = tdf.file_tracker.get_queued_size(); let queued_data = tdf.file_tracker.get_queued_size();
if queued_data > 2000000 { // TODO should probably be configurable if queued_data > 2000000 { // TODO should probably be configurable
SCLogDebug!("QUEUED size {} while we've seen GAPs. Truncating file.", queued_data); SCLogDebug!("QUEUED size {} while we've seen GAPs. Truncating file.", queued_data);
tdf.file_tracker.trunc(files, flags); filetracker_trunc(&mut tdf.file_tracker, files, flags);
} }
} }
@ -195,8 +211,7 @@ impl SMBState {
} }
let file_data = &data[0..data_to_handle_len]; let file_data = &data[0..data_to_handle_len];
let cs = tdf.file_tracker.update(files, flags, file_data, gap_size); filetracker_update(&mut tdf.file_tracker, files, flags, file_data, gap_size)
cs
} else { } else {
0 0
} }

@ -1098,7 +1098,7 @@ impl SMBState {
tx.request_done = true; tx.request_done = true;
tx.response_done = true; tx.response_done = true;
let (files, flags) = f.files.get(f.direction); let (files, flags) = f.files.get(f.direction);
f.file_tracker.trunc(files, flags); filetracker_trunc(&mut f.file_tracker, files, flags);
} else { } else {
post_gap_txs = true; post_gap_txs = true;
} }

@ -156,7 +156,7 @@ fn smb1_close_file(state: &mut SMBState, fid: &[u8], direction: Direction)
if !tx.request_done { if !tx.request_done {
SCLogDebug!("closing file tx {} FID {:?}", tx.id, fid); SCLogDebug!("closing file tx {} FID {:?}", tx.id, fid);
let (files, flags) = tdf.files.get(direction); let (files, flags) = tdf.files.get(direction);
tdf.file_tracker.close(files, flags); filetracker_close(&mut tdf.file_tracker, files, flags);
tx.request_done = true; tx.request_done = true;
tx.response_done = true; tx.response_done = true;
SCLogDebug!("tx {} is done", tx.id); SCLogDebug!("tx {} is done", tx.id);

@ -595,7 +595,7 @@ pub fn smb2_request_record<'b>(state: &mut SMBState, r: &Smb2Record<'b>)
if !tx.request_done { if !tx.request_done {
if let Some(SMBTransactionTypeData::FILE(ref mut tdf)) = tx.type_data { if let Some(SMBTransactionTypeData::FILE(ref mut tdf)) = tx.type_data {
let (files, flags) = tdf.files.get(Direction::ToServer); let (files, flags) = tdf.files.get(Direction::ToServer);
tdf.file_tracker.close(files, flags); filetracker_close(&mut tdf.file_tracker, files, flags);
} }
} }
tx.request_done = true; tx.request_done = true;
@ -610,7 +610,7 @@ pub fn smb2_request_record<'b>(state: &mut SMBState, r: &Smb2Record<'b>)
if !tx.request_done { if !tx.request_done {
if let Some(SMBTransactionTypeData::FILE(ref mut tdf)) = tx.type_data { if let Some(SMBTransactionTypeData::FILE(ref mut tdf)) = tx.type_data {
let (files, flags) = tdf.files.get(Direction::ToClient); let (files, flags) = tdf.files.get(Direction::ToClient);
tdf.file_tracker.close(files, flags); filetracker_close(&mut tdf.file_tracker, files, flags);
} }
} }
tx.request_done = true; tx.request_done = true;
@ -709,7 +709,7 @@ pub fn smb2_response_record<'b>(state: &mut SMBState, r: &Smb2Record<'b>)
if !tx.request_done { if !tx.request_done {
if let Some(SMBTransactionTypeData::FILE(ref mut tdf)) = tx.type_data { if let Some(SMBTransactionTypeData::FILE(ref mut tdf)) = tx.type_data {
let (files, flags) = tdf.files.get(Direction::ToClient); let (files, flags) = tdf.files.get(Direction::ToClient);
tdf.file_tracker.close(files, flags); filetracker_close(&mut tdf.file_tracker, files, flags);
} }
} }
tx.set_status(r.nt_status, false); tx.set_status(r.nt_status, false);

Loading…
Cancel
Save