]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
smb1: fix 'event' txs not getting closed
authorVictor Julien <victor@inliniac.net>
Wed, 4 Dec 2019 09:06:01 +0000 (10:06 +0100)
committerVictor Julien <victor@inliniac.net>
Mon, 9 Dec 2019 19:12:03 +0000 (20:12 +0100)
If the only reason we created a request side TX was to set an event,
we would not close it.

This patch always looks up the TX from the response side.

rust/src/smb/smb1.rs

index ac56f5d6ecd9e7f2f381622c3ffad35258374097..b4262cf0ccd26cbe8c41b2a8524b0bd0274869b1 100644 (file)
@@ -1053,21 +1053,19 @@ fn smb1_request_record_generic<'b>(state: &mut SMBState, r: &SmbRecord<'b>, even
 /// on the response. We only create a tx for the response side
 /// if we didn't already update a tx, and we have to set events
 fn smb1_response_record_generic<'b>(state: &mut SMBState, r: &SmbRecord<'b>, events: Vec<SMBEvent>) {
-    // see if we want a tx per command
-    if smb1_create_new_tx(r.command) {
-        let tx_key = SMBCommonHdr::from1(r, SMBHDR_TYPE_GENERICTX);
-        let tx = state.get_generic_tx(1, r.command as u16, &tx_key);
-        if let Some(tx) = tx {
+    let tx_key = SMBCommonHdr::from1(r, SMBHDR_TYPE_GENERICTX);
+    match state.get_generic_tx(1, r.command as u16, &tx_key) {
+        Some(tx) => {
             tx.request_done = true;
             tx.response_done = true;
             SCLogDebug!("tx {} cmd {} is done", tx.id, r.command);
             tx.set_status(r.nt_status, r.is_dos_error);
             tx.set_events(events);
             return;
-        }
+        },
+        None => {},
     }
     if events.len() > 0 {
-        let tx_key = SMBCommonHdr::from1(r, SMBHDR_TYPE_GENERICTX);
         let tx = state.new_generic_tx(1, r.command as u16, tx_key);
         tx.request_done = true;
         tx.response_done = true;