nfs: file handling cleanups

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

@ -295,14 +295,31 @@ 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, fill_bytes: u8, is_last: bool, xid: &u32) chunk_offset: u64, chunk_size: u32, fill_bytes: u8, is_last: bool, xid: &u32)
{ {
match unsafe {SURICATA_NFS_FILE_CONFIG} { if let Some(sfcm) = unsafe { SURICATA_NFS_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, fill_bytes, is_last, xid); } chunk_size, fill_bytes, is_last, xid);
None => panic!("no SURICATA_NFS_FILE_CONFIG"),
} }
} }
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)
}
#[derive(Debug)] #[derive(Debug)]
pub struct NFSState { pub struct NFSState {
state_data: AppLayerStateData, state_data: AppLayerStateData,
@ -590,7 +607,7 @@ impl NFSState {
tx.request_done = true; tx.request_done = true;
tx.response_done = true; tx.response_done = true;
let (files, flags) = f.files.get(tx.file_tx_direction); let (files, flags) = f.files.get(tx.file_tx_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;
} }
@ -945,7 +962,7 @@ impl NFSState {
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);
} }
} }
@ -955,7 +972,7 @@ impl NFSState {
} }
tdf.chunk_count += 1; tdf.chunk_count += 1;
let cs = tdf.file_tracker.update(files, flags, data, gap_size); let cs = filetracker_update(&mut tdf.file_tracker, files, flags, data, gap_size);
/* see if we need to close the tx */ /* see if we need to close the tx */
if tdf.file_tracker.is_done() { if tdf.file_tracker.is_done() {
if direction == Direction::ToClient { if direction == Direction::ToClient {

@ -123,7 +123,7 @@ impl NFSState {
let (files, flags) = tdf.files.get(Direction::ToServer); let (files, flags) = tdf.files.get(Direction::ToServer);
tdf.chunk_count += 1; tdf.chunk_count += 1;
tdf.file_additional_procs.push(NFSPROC3_COMMIT); tdf.file_additional_procs.push(NFSPROC3_COMMIT);
tdf.file_tracker.close(files, flags); filetracker_close(&mut tdf.file_tracker, files, flags);
tdf.file_last_xid = r.hdr.xid; tdf.file_last_xid = r.hdr.xid;
tx.is_last = true; tx.is_last = true;
tx.request_done = true; tx.request_done = true;

@ -118,7 +118,7 @@ impl NFSState {
if let Some(tx) = self.get_file_tx_by_handle(&file_handle, Direction::ToServer) { if let Some(tx) = self.get_file_tx_by_handle(&file_handle, Direction::ToServer) {
if let Some(NFSTransactionTypeData::FILE(ref mut tdf)) = tx.type_data { if let Some(NFSTransactionTypeData::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);
tdf.file_last_xid = r.hdr.xid; tdf.file_last_xid = r.hdr.xid;
tx.is_last = true; tx.is_last = true;
tx.request_done = true; tx.request_done = true;

Loading…
Cancel
Save