]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
smb: file handling cleanups
authorVictor Julien <vjulien@oisf.net>
Fri, 20 Jan 2023 14:27:23 +0000 (15:27 +0100)
committerVictor Julien <vjulien@oisf.net>
Mon, 23 Jan 2023 08:17:26 +0000 (09:17 +0100)
rust/src/smb/files.rs
rust/src/smb/smb.rs
rust/src/smb/smb1.rs
rust/src/smb/smb2.rs

index 37f60aec2162c28841dfb8abb11dc7ecefe44d7b..938ffaffab598d3f80003d54e88c7dc1040b367c 100644 (file)
@@ -55,14 +55,30 @@ pub fn filetracker_newchunk(ft: &mut FileTransferTracker, files: &mut FileContai
         flags: u16, name: &[u8], data: &[u8],
         chunk_offset: u64, chunk_size: u32, is_last: bool, xid: &u32)
 {
-    match unsafe {SURICATA_SMB_FILE_CONFIG} {
-        Some(sfcm) => {
-            ft.new_chunk(sfcm, files, flags, name, data, chunk_offset,
-                    chunk_size, 0, is_last, xid); }
-        None => panic!("no SURICATA_SMB_FILE_CONFIG"),
+    if let Some(sfcm) = unsafe { SURICATA_SMB_FILE_CONFIG } {
+        ft.new_chunk(sfcm, files, flags, name, data, chunk_offset,
+                chunk_size, 0, is_last, xid);
     }
 }
 
+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 {
     pub fn new_file_tx(&mut self, fuid: &[u8], file_name: &[u8], direction: Direction)
         -> &mut SMBTransaction
@@ -185,7 +201,7 @@ impl SMBState {
                         let queued_data = tdf.file_tracker.get_queued_size();
                         if queued_data > 2000000 { // TODO should probably be configurable
                             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 cs = tdf.file_tracker.update(files, flags, file_data, gap_size);
-                    cs
+                    filetracker_update(&mut tdf.file_tracker, files, flags, file_data, gap_size)
                 } else {
                     0
                 }
index 370d48bd0f5a800c044b7aedaad9a38238720551..e811d139219ecfbff48535d15ae4ffe220d46793 100644 (file)
@@ -1098,7 +1098,7 @@ impl SMBState {
                         tx.request_done = true;
                         tx.response_done = true;
                         let (files, flags) = f.files.get(f.direction);
-                        f.file_tracker.trunc(files, flags);
+                        filetracker_trunc(&mut f.file_tracker, files, flags);
                     } else {
                         post_gap_txs = true;
                     }
index a85b025edd53d989cac216438b4bb147f0ada424..3ddcf6ddf72a4ccd671bcce12cbcccdf24800c83 100644 (file)
@@ -156,7 +156,7 @@ fn smb1_close_file(state: &mut SMBState, fid: &[u8], direction: Direction)
             if !tx.request_done {
                 SCLogDebug!("closing file tx {} FID {:?}", tx.id, fid);
                 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.response_done = true;
                 SCLogDebug!("tx {} is done", tx.id);
index 0c1daba6d71896eb3b20f4a70839e54c639b3666..b9fb924ffcfabe654a24de0d8898594458822774 100644 (file)
@@ -595,7 +595,7 @@ pub fn smb2_request_record<'b>(state: &mut SMBState, r: &Smb2Record<'b>)
                             if !tx.request_done {
                                 if let Some(SMBTransactionTypeData::FILE(ref mut tdf)) = tx.type_data {
                                     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;
@@ -610,7 +610,7 @@ pub fn smb2_request_record<'b>(state: &mut SMBState, r: &Smb2Record<'b>)
                             if !tx.request_done {
                                 if let Some(SMBTransactionTypeData::FILE(ref mut tdf)) = tx.type_data {
                                     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;
@@ -709,7 +709,7 @@ pub fn smb2_response_record<'b>(state: &mut SMBState, r: &Smb2Record<'b>)
                         if !tx.request_done {
                             if let Some(SMBTransactionTypeData::FILE(ref mut tdf)) = tx.type_data {
                                 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);