]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
smb: use derived get_event_info/get_event_info_by_id
authorJason Ish <jason.ish@oisf.net>
Mon, 19 Oct 2020 18:28:15 +0000 (12:28 -0600)
committerVictor Julien <victor@inliniac.net>
Wed, 1 Sep 2021 06:33:52 +0000 (08:33 +0200)
rust/src/smb/events.rs
rust/src/smb/smb.rs

index 1b29da7d4394b3a7d295a10a17708a1ba8f6cc5f..8fb27a0cc69f31785ba3446e17733fc81f489726 100644 (file)
 use crate::core::*;
 use crate::smb::smb::*;
 
-#[repr(u32)]
+#[derive(AppLayerEvent)]
 pub enum SMBEvent {
-    InternalError = 0,
-    MalformedData = 1,
-    RecordOverflow = 2,
-    MalformedNtlmsspRequest = 3,
-    MalformedNtlmsspResponse = 4,
-    DuplicateNegotiate = 5,
-    NegotiateMalformedDialects = 6,
-    FileOverlap = 7,
-}
-
-impl SMBEvent {
-    pub fn from_i32(value: i32) -> Option<SMBEvent> {
-        match value {
-            0 => Some(SMBEvent::InternalError),
-            1 => Some(SMBEvent::MalformedData),
-            2 => Some(SMBEvent::RecordOverflow),
-            3 => Some(SMBEvent::MalformedNtlmsspRequest),
-            4 => Some(SMBEvent::MalformedNtlmsspResponse),
-            5 => Some(SMBEvent::DuplicateNegotiate),
-            6 => Some(SMBEvent::NegotiateMalformedDialects),
-            7 => Some(SMBEvent::FileOverlap),
-            _ => None,
-        }
-    }
-}
-
-pub fn smb_str_to_event(instr: &str) -> i32 {
-    SCLogDebug!("checking {}", instr);
-    match instr {
-        "internal_error"                => SMBEvent::InternalError as i32,
-        "malformed_data"                => SMBEvent::MalformedData as i32,
-        "record_overflow"               => SMBEvent::RecordOverflow as i32,
-        "malformed_ntlmssp_request"     => SMBEvent::MalformedNtlmsspRequest as i32,
-        "malformed_ntlmssp_response"    => SMBEvent::MalformedNtlmsspResponse as i32,
-        "duplicate_negotiate"           => SMBEvent::DuplicateNegotiate as i32,
-        "negotiate_malformed_dialects"  => SMBEvent::NegotiateMalformedDialects as i32,
-        "file_overlap"                  => SMBEvent::FileOverlap as i32,
-        _ => -1,
-    }
+    InternalError,
+    MalformedData,
+    RecordOverflow,
+    MalformedNtlmsspRequest,
+    MalformedNtlmsspResponse,
+    DuplicateNegotiate,
+    NegotiateMalformedDialects,
+    FileOverlap,
 }
 
 impl SMBTransaction {
index 44e8b7c101fec803eee5e6ba6c535186b31c0e04..bd563efc4b42f436c7e3d07b1674b258d620220f 100644 (file)
@@ -27,7 +27,7 @@
 
 use std;
 use std::str;
-use std::ffi::{self, CStr, CString};
+use std::ffi::{self, CString};
 
 use std::collections::HashMap;
 
@@ -38,6 +38,7 @@ use crate::applayer;
 use crate::applayer::*;
 use crate::conf::*;
 use crate::filecontainer::*;
+use crate::applayer::{AppLayerResult, AppLayerTxData, AppLayerEvent};
 
 use crate::smb::nbss_records::*;
 use crate::smb::smb1_records::*;
@@ -2137,52 +2138,21 @@ pub unsafe extern "C" fn rs_smb_state_get_events(tx: *mut std::os::raw::c_void)
 }
 
 #[no_mangle]
-pub unsafe extern "C" fn rs_smb_state_get_event_info_by_id(event_id: std::os::raw::c_int,
-                                              event_name: *mut *const std::os::raw::c_char,
-                                              event_type: *mut AppLayerEventType)
-                                              -> i8
-{
-    if let Some(e) = SMBEvent::from_i32(event_id as i32) {
-        let estr = match e {
-            SMBEvent::InternalError => { "internal_error\0" },
-            SMBEvent::MalformedData => { "malformed_data\0" },
-            SMBEvent::RecordOverflow => { "record_overflow\0" },
-            SMBEvent::MalformedNtlmsspRequest => { "malformed_ntlmssp_request\0" },
-            SMBEvent::MalformedNtlmsspResponse => { "malformed_ntlmssp_response\0" },
-            SMBEvent::DuplicateNegotiate => { "duplicate_negotiate\0" },
-            SMBEvent::NegotiateMalformedDialects => { "netogiate_malformed_dialects\0" },
-            SMBEvent::FileOverlap => { "file_overlap\0" },
-        };
-        *event_name = estr.as_ptr() as *const std::os::raw::c_char;
-        *event_type = APP_LAYER_EVENT_TYPE_TRANSACTION;
-        0
-    } else {
-        -1
-    }
+pub unsafe extern "C" fn rs_smb_state_get_event_info_by_id(
+    event_id: std::os::raw::c_int,
+    event_name: *mut *const std::os::raw::c_char,
+    event_type: *mut AppLayerEventType,
+) -> i8 {
+    SMBEvent::get_event_info_by_id(event_id, event_name, event_type)
 }
 
 #[no_mangle]
-pub unsafe extern "C" fn rs_smb_state_get_event_info(event_name: *const std::os::raw::c_char,
-                                              event_id: *mut std::os::raw::c_int,
-                                              event_type: *mut AppLayerEventType)
-                                              -> i32
-{
-    if event_name == std::ptr::null() {
-        return -1;
-    }
-    let c_event_name: &CStr = CStr::from_ptr(event_name);
-    let event = match c_event_name.to_str() {
-        Ok(s) => {
-            smb_str_to_event(s)
-        },
-        Err(_) => -1, // UTF-8 conversion failed
-    };
-    *event_type = APP_LAYER_EVENT_TYPE_TRANSACTION;
-    *event_id = event as std::os::raw::c_int;
-    if event == -1 {
-        return -1;
-    }
-    0
+pub unsafe extern "C" fn rs_smb_state_get_event_info(
+    event_name: *const std::os::raw::c_char,
+    event_id: *mut std::os::raw::c_int,
+    event_type: *mut AppLayerEventType,
+) -> std::os::raw::c_int {
+    SMBEvent::get_event_info(event_name, event_id, event_type)
 }
 
 pub unsafe extern "C" fn smb3_probe_tcp(f: *const Flow, dir: u8, input: *const u8, len: u32, rdir: *mut u8) -> u16 {