]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
nfs: derive AppLayerEvent for NFSEvent
authorPhilippe Antoine <contact@catenacyber.fr>
Thu, 3 Feb 2022 20:58:51 +0000 (21:58 +0100)
committerVictor Julien <vjulien@oisf.net>
Wed, 16 Feb 2022 13:24:37 +0000 (14:24 +0100)
rust/src/nfs/nfs.rs

index c3599d42e308dc77543dbc6d9d51b006db0d601f..b232da3b1e2ce7512657ddada96abb2ddd9e6640 100644 (file)
@@ -20,7 +20,7 @@
 use std;
 use std::cmp;
 use std::collections::HashMap;
-use std::ffi::{CStr, CString};
+use std::ffi::CString;
 
 use nom7::{Err, Needed};
 
@@ -85,25 +85,13 @@ static mut ALPROTO_NFS: AppProto = ALPROTO_UNKNOWN;
  * Transaction lookup.
  */
 
-#[repr(u32)]
+#[derive(FromPrimitive, Debug, AppLayerEvent)]
 pub enum NFSEvent {
     MalformedData = 0,
     NonExistingVersion = 1,
     UnsupportedVersion = 2,
 }
 
-impl NFSEvent {
-    fn from_i32(value: i32) -> Option<NFSEvent> {
-        match value {
-            0 => Some(NFSEvent::MalformedData),
-            1 => Some(NFSEvent::NonExistingVersion),
-            2 => Some(NFSEvent::UnsupportedVersion),
-            _ => None,
-        }
-    }
-}
-
-
 #[derive(Debug)]
 pub enum NFSTransactionTypeData {
     RENAME(Vec<u8>),
@@ -1527,51 +1515,6 @@ pub unsafe extern "C" fn rs_nfs_get_tx_data(
     return &mut tx.tx_data;
 }
 
-#[no_mangle]
-pub unsafe extern "C" fn rs_nfs_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) = NFSEvent::from_i32(event_id as i32) {
-        let estr = match e {
-            NFSEvent::MalformedData => { "malformed_data\0" },
-            NFSEvent::NonExistingVersion => { "non_existing_version\0" },
-            NFSEvent::UnsupportedVersion => { "unsupported_version\0" },
-        };
-        *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 unsafe extern "C" fn rs_nfs_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
-{
-    if event_name.is_null() {
-        return -1;
-    }
-    let c_event_name: &CStr = CStr::from_ptr(event_name);
-    let event = match c_event_name.to_str() {
-        Ok(s) => {
-            match s {
-                "malformed_data" => NFSEvent::MalformedData as i32,
-                _ => -1, // unknown event
-            }
-        },
-        Err(_) => -1, // UTF-8 conversion failed
-    };
-    *event_type = APP_LAYER_EVENT_TYPE_TRANSACTION;
-    *event_id = event as std::os::raw::c_int;
-    0
-}
-
 /// return procedure(s) in the tx. At 0 return the main proc,
 /// otherwise get procs from the 'file_additional_procs'.
 /// Keep calling until 0 is returned.
@@ -1853,8 +1796,8 @@ pub unsafe extern "C" fn rs_nfs_register_parser() {
         tx_comp_st_ts: 1,
         tx_comp_st_tc: 1,
         tx_get_progress: rs_nfs_tx_get_alstate_progress,
-        get_eventinfo: Some(rs_nfs_state_get_event_info),
-        get_eventinfo_byid : Some(rs_nfs_state_get_event_info_by_id),
+        get_eventinfo: Some(NFSEvent::get_event_info),
+        get_eventinfo_byid : Some(NFSEvent::get_event_info_by_id),
         localstorage_new: None,
         localstorage_free: None,
         get_files: Some(rs_nfs_getfiles),
@@ -1931,8 +1874,8 @@ pub unsafe extern "C" fn rs_nfs_udp_register_parser() {
         tx_comp_st_ts: 1,
         tx_comp_st_tc: 1,
         tx_get_progress: rs_nfs_tx_get_alstate_progress,
-        get_eventinfo: Some(rs_nfs_state_get_event_info),
-        get_eventinfo_byid : None,
+        get_eventinfo: Some(NFSEvent::get_event_info),
+        get_eventinfo_byid : Some(NFSEvent::get_event_info_by_id),
         localstorage_new: None,
         localstorage_free: None,
         get_files: Some(rs_nfs_getfiles),