]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
smb: add missing code from rust impl of fns
authorShivani Bhardwaj <shivanib134@gmail.com>
Tue, 29 Jun 2021 09:30:07 +0000 (15:00 +0530)
committerShivani Bhardwaj <shivanib134@gmail.com>
Thu, 5 Aug 2021 15:22:05 +0000 (20:52 +0530)
rust/src/smb/files.rs
rust/src/smb/smb.rs

index d02bca8e2d8edc3077b63971477347eef61fa195..704d60a0cf896de2453697857b71f4daaf3275ee 100644 (file)
@@ -112,7 +112,7 @@ impl SMBState {
     }
     fn setfileflags(&mut self, direction: u8, flags: u16) {
         SCLogDebug!("direction: {}, flags: {}", direction, flags);
-        if direction == 1 {
+        if direction == STREAM_TOCLIENT {
             self.files.flags_tc = flags;
         } else {
             self.files.flags_ts = flags;
index 7837d71873922440804ee276784074c9771ba22f..d5576e70308fab0cf8bc598320d62d18039e22b5 100644 (file)
@@ -1824,8 +1824,13 @@ pub extern "C" fn rs_smb_parse_request_tcp(flow: *const Flow,
     let buf = unsafe{std::slice::from_raw_parts(input, input_len as usize)};
     let mut state = cast_pointer!(state, SMBState);
     let flow = cast_pointer!(flow, Flow);
+    let file_flags = unsafe { FileFlowToFlags(flow, STREAM_TOSERVER) };
+    rs_smb_setfileflags(STREAM_TOSERVER, state, file_flags|FILE_USE_DETECT);
     SCLogDebug!("parsing {} bytes of request data", input_len);
 
+    if input.is_null() && input_len > 0 {
+        return rs_smb_parse_request_tcp_gap(state, input_len);
+    }
     /* START with MISTREAM set: record might be starting the middle. */
     if flags & (STREAM_START|STREAM_MIDSTREAM) == (STREAM_START|STREAM_MIDSTREAM) {
         state.ts_gap = true;
@@ -1857,6 +1862,12 @@ pub extern "C" fn rs_smb_parse_response_tcp(flow: *const Flow,
 {
     let mut state = cast_pointer!(state, SMBState);
     let flow = cast_pointer!(flow, Flow);
+    let file_flags = unsafe { FileFlowToFlags(flow, STREAM_TOCLIENT) };
+    rs_smb_setfileflags(STREAM_TOCLIENT, state, file_flags|FILE_USE_DETECT);
+
+    if input.is_null() && input_len > 0 {
+        return rs_smb_parse_response_tcp_gap(state, input_len);
+    }
     SCLogDebug!("parsing {} bytes of response data", input_len);
     let buf = unsafe{std::slice::from_raw_parts(input, input_len as usize)};
 
@@ -1948,6 +1959,9 @@ pub extern "C" fn rs_smb_probe_tcp(_f: *const Flow,
                                    flags: u8, input: *const u8, len: u32, rdir: *mut u8)
     -> AppProto
 {
+    if len < MIN_REC_SIZE as u32 {
+        return ALPROTO_UNKNOWN;
+    }
     let slice = build_slice!(input, len as usize);
     if flags & STREAM_MIDSTREAM == STREAM_MIDSTREAM {
         if smb_probe_tcp_midstream(flags, slice, rdir) == 1 {