]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
rust/smb: Implement get event by id
authorJeff Lucovsky <jeff@lucovsky.org>
Sat, 8 Jun 2019 20:07:23 +0000 (16:07 -0400)
committerVictor Julien <victor@inliniac.net>
Thu, 20 Jun 2019 18:14:58 +0000 (20:14 +0200)
rust/src/smb/events.rs
rust/src/smb/smb.rs
src/app-layer-smb.c

index 22d65acb055e348b4cd0f8b8389b32112344681a..c89b0664b68c4028f38a5ed37dee69a7b6b4f360 100644 (file)
@@ -30,6 +30,21 @@ pub enum SMBEvent {
     NegotiateMalformedDialects = 6,
 }
 
+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),
+            _ => None,
+        }
+    }
+}
+
 pub fn smb_str_to_event(instr: &str) -> i32 {
     SCLogDebug!("checking {}", instr);
     match instr {
index 7ae9fcf49e734425755c1f5b85916779c12be9e8..5671a0d8075cab53821222cb4003aa3f8ccb13bf 100644 (file)
@@ -2111,6 +2111,32 @@ pub extern "C" fn rs_smb_state_get_events(tx: *mut std::os::raw::c_void)
     return tx.events;
 }
 
+#[no_mangle]
+pub 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" },
+        };
+        unsafe{
+            *event_name = estr.as_ptr() as *const std::os::raw::c_char;
+            *event_type = APP_LAYER_EVENT_TYPE_TRANSACTION;
+        };
+        0
+    } else {
+        -1
+    }
+}
+
 #[no_mangle]
 pub 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,
index 95d5a58926f597efe3bdd200774494e3cac13a68..807876cc9c1615158658d0cb5632e669be4bf01c 100644 (file)
@@ -194,9 +194,7 @@ static AppLayerDecoderEvents *SMBGetEvents(void *tx)
 static int SMBGetEventInfoById(int event_id, const char **event_name,
     AppLayerEventType *event_type)
 {
-    *event_name = "SMB event name (generic)";
-    *event_type = APP_LAYER_EVENT_TYPE_TRANSACTION;
-    return 0;
+    return rs_smb_state_get_event_info_by_id(event_id, event_name, event_type);
 }
 
 static int SMBGetEventInfo(const char *event_name, int *event_id,