From 0216af5b3f1192fb08205a278542e3b3d5a15c49 Mon Sep 17 00:00:00 2001 From: Jason Ish Date: Wed, 23 Oct 2024 13:36:06 -0600 Subject: [PATCH 1/7] Revert "rust/applayer: use c_int as return type for get_info_by_id" This reverts commit 45384ef969d180d962f4b50f19556c5e2c5cfccc. --- rust/derive/src/applayerevent.rs | 2 +- rust/src/applayer.rs | 6 +++--- rust/src/smb/smb.rs | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/rust/derive/src/applayerevent.rs b/rust/derive/src/applayerevent.rs index 37e5dd0797cc..c4402381120a 100644 --- a/rust/derive/src/applayerevent.rs +++ b/rust/derive/src/applayerevent.rs @@ -98,7 +98,7 @@ pub fn derive_app_layer_event(input: TokenStream) -> TokenStream { event_id: std::os::raw::c_int, event_name: *mut *const std::os::raw::c_char, event_type: *mut #crate_id::core::AppLayerEventType, - ) -> std::os::raw::c_int { + ) -> i8 { #crate_id::applayer::get_event_info_by_id::<#name>(event_id, event_name, event_type) } diff --git a/rust/src/applayer.rs b/rust/src/applayer.rs index 652775a66799..f863546bbe06 100644 --- a/rust/src/applayer.rs +++ b/rust/src/applayer.rs @@ -445,7 +445,7 @@ pub type StateGetTxFn = unsafe extern "C" fn (*mut c_void, u64) -> *m pub type StateGetTxCntFn = unsafe extern "C" fn (*mut c_void) -> u64; pub type StateGetProgressFn = unsafe extern "C" fn (*mut c_void, u8) -> c_int; pub type GetEventInfoFn = unsafe extern "C" fn (*const c_char, *mut c_int, *mut AppLayerEventType) -> c_int; -pub type GetEventInfoByIdFn = unsafe extern "C" fn (c_int, *mut *const c_char, *mut AppLayerEventType) -> c_int; +pub type GetEventInfoByIdFn = unsafe extern "C" fn (c_int, *mut *const c_char, *mut AppLayerEventType) -> i8; pub type LocalStorageNewFn = extern "C" fn () -> *mut c_void; pub type LocalStorageFreeFn = extern "C" fn (*mut c_void); pub type GetTxFilesFn = unsafe extern "C" fn (*mut c_void, u8) -> AppLayerGetFileState; @@ -590,7 +590,7 @@ pub trait AppLayerEvent { event_id: std::os::raw::c_int, event_name: *mut *const std::os::raw::c_char, event_type: *mut core::AppLayerEventType, - ) -> std::os::raw::c_int; + ) -> i8; } /// Generic `get_info_info` implementation for enums implementing @@ -634,7 +634,7 @@ pub unsafe fn get_event_info_by_id( event_id: std::os::raw::c_int, event_name: *mut *const std::os::raw::c_char, event_type: *mut core::AppLayerEventType, -) -> std::os::raw::c_int { +) -> i8 { if let Some(e) = T::from_id(event_id) { *event_name = e.to_cstring().as_ptr() as *const std::os::raw::c_char; *event_type = core::AppLayerEventType::APP_LAYER_EVENT_TYPE_TRANSACTION; diff --git a/rust/src/smb/smb.rs b/rust/src/smb/smb.rs index c5d2f6916509..0d35d6debb3e 100644 --- a/rust/src/smb/smb.rs +++ b/rust/src/smb/smb.rs @@ -2206,7 +2206,7 @@ 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, -) -> std::os::raw::c_int { +) -> i8 { SMBEvent::get_event_info_by_id(event_id, event_name, event_type) } From de286192b66cc16d51772fc716bff8e678376e0a Mon Sep 17 00:00:00 2001 From: Jason Ish Date: Wed, 23 Oct 2024 12:10:46 -0600 Subject: [PATCH 2/7] app-layer: extract out a simple function type to simple header Extract a simple function function to a simple header with no circular dependencies. Next we'll use bindgen to generate Rust bindings for this function. Ticket: #7341 --- src/Makefile.am | 1 + src/app-layer-ext.h | 8 ++++++++ src/app-layer-register.h | 3 ++- 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 src/app-layer-ext.h diff --git a/src/Makefile.am b/src/Makefile.am index 6970d709f35c..d1ab3af75a83 100755 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -19,6 +19,7 @@ noinst_HEADERS = \ app-layer-dnp3-objects.h \ app-layer-events.h \ app-layer-expectation.h \ + app-layer-ext.h \ app-layer-frames.h \ app-layer-ftp.h \ app-layer.h \ diff --git a/src/app-layer-ext.h b/src/app-layer-ext.h new file mode 100644 index 000000000000..5eceb863e897 --- /dev/null +++ b/src/app-layer-ext.h @@ -0,0 +1,8 @@ +#ifndef SURICATA_APP_LAYER_EXT_H +#define SURICATA_APP_LAYER_EXT_H + +#include + +typedef int (*SCAppLayerStateGetProgressFn)(void *alstate, uint8_t direction); + +#endif /* SURICATA_APP_LAYER_EXT_H */ diff --git a/src/app-layer-register.h b/src/app-layer-register.h index 78eff7d8e4ce..15e99707d3f7 100644 --- a/src/app-layer-register.h +++ b/src/app-layer-register.h @@ -25,6 +25,7 @@ #define SURICATA_APP_LAYER_REGISTER_H #include "app-layer-detect-proto.h" +#include "app-layer-ext.h" typedef struct AppLayerParser { const char *name; @@ -49,7 +50,7 @@ typedef struct AppLayerParser { const int complete_ts; const int complete_tc; - int (*StateGetProgress)(void *alstate, uint8_t direction); + SCAppLayerStateGetProgressFn StateGetProgress; int (*StateGetEventInfo)(const char *event_name, int *event_id, AppLayerEventType *event_type); From ad27d3b02776b781740dba1ac4a0944c93ba23b5 Mon Sep 17 00:00:00 2001 From: Jason Ish Date: Thu, 24 Oct 2024 08:24:00 -0600 Subject: [PATCH 3/7] rust: integrate bindgen to generate rust bindings to C Add a build.rs to generate Rust bindings to specific C functions at build time using the bindgen crate. As can be seen in build.rs, we currently only pull in the test header, "app-layer-ext.h" and only output items starting with "SC". Bindgen generates the bindings in a file named "bindings.rs" in the target/ direction, which "sys.rs" will statically "include" at compiling name, making these bindings available under package "crate::sys". "build.rs" had to be placed in the non-standard location of "src/build.rs" (its usually alongside Cargo.toml) to satisfy the out-of-tree build requirements of distcheck. Note that bindgen is also available as a command line tool which could be used instead of integrating this at compile time, however the tool requires a newer version of Rust than our MSRV, and may present additional issues with respect to autoconf and distcheck. --- rust/Cargo.toml.in | 9 +++++++++ rust/src/build.rs | 26 ++++++++++++++++++++++++++ rust/src/lib.rs | 3 +++ rust/src/sys.rs | 18 ++++++++++++++++++ 4 files changed, 56 insertions(+) create mode 100644 rust/src/build.rs create mode 100644 rust/src/sys.rs diff --git a/rust/Cargo.toml.in b/rust/Cargo.toml.in index c69db937708e..d932b3f6ec81 100644 --- a/rust/Cargo.toml.in +++ b/rust/Cargo.toml.in @@ -5,6 +5,7 @@ license = "GPL-2.0-only" description = "Suricata Rust components" edition = "2021" rust-version = "1.67.1" +build = "src/build.rs" [workspace] members = [".", "./derive"] @@ -72,3 +73,11 @@ suricata-lua-sys = { version = "0.1.0-alpha.1" } [dev-dependencies] test-case = "~3.3.1" hex = "~0.4.3" + +[build-dependencies] +# Pin as bindgen 0.70.1 requires Rust 1.70.0+ +bindgen = "=0.69.4" + +# Most recent version to support Rust 1.67. 0.5.9 requires 1.70.0. +# - Not used directly but Suricata, but by bindgen. +home = "=0.5.5" diff --git a/rust/src/build.rs b/rust/src/build.rs new file mode 100644 index 000000000000..517851d78e2b --- /dev/null +++ b/rust/src/build.rs @@ -0,0 +1,26 @@ +// builds.rs for Suricata +// +// Currently this build.rs only uses bindgen to build some Rust +// bindings to the Suricata C code. +// +// For more info on Rust and the build.rs file, see: +// https://doc.rust-lang.org/cargo/reference/build-scripts.html +fn main() { + // Pull in a simple header that presents no issues with bindgen at + // this time. Multiple headers can be specified. + let bindings = bindgen::Builder::default() + .header("../src/app-layer-ext.h") + .parse_callbacks(Box::new(bindgen::CargoCallbacks::new())) + .allowlist_item("SC.*") + .generate() + .unwrap(); + + // Write out the bindings. *Rules* say we should only write into + // the target directory (idiomatically the OUT_DIR env var), so + // we'll pull them into our namespace using an include!() macro + // (current in sys.rs). + let out_path = std::path::PathBuf::from(std::env::var("OUT_DIR").unwrap()); + bindings + .write_to_file(out_path.join("bindings.rs")) + .unwrap(); +} diff --git a/rust/src/lib.rs b/rust/src/lib.rs index 7a99cd2532e5..665721d9558f 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -134,3 +134,6 @@ pub mod ldap; #[allow(unused_imports)] pub use suricata_lua_sys; + +// Generated Rust bindings from C. +pub mod sys; diff --git a/rust/src/sys.rs b/rust/src/sys.rs new file mode 100644 index 000000000000..cb933dae54fe --- /dev/null +++ b/rust/src/sys.rs @@ -0,0 +1,18 @@ +/* Copyright (C) 2024 Open Information Security Foundation + * + * You can copy, redistribute or modify this Program under the terms of + * the GNU General Public License version 2 as published by the Free + * Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * version 2 along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +include!(concat!(env!("OUT_DIR"), "/bindings.rs")); From e010f9b25a0e3424e9b35016116c5342ac5d2332 Mon Sep 17 00:00:00 2001 From: Jason Ish Date: Thu, 24 Oct 2024 08:24:34 -0600 Subject: [PATCH 4/7] rust: used bindgen generated bindings for StateGetProgressFn This function is now named SCAppLayerStateGetProgressFn, note how its definition differs from ours: pub type SCAppLayerStateGetProgressFn = ::std::option::Option< unsafe extern "C" fn( alstate: *mut ::std::os::raw::c_void, direction: u8, ) -> ::std::os::raw::c_int, >; Our previous definition: pub type StateGetProgressFn = unsafe extern "C" fn (*mut c_void, u8) -> c_int; The main differing being wrapped in an option which makes sense as its a function pointer that could be NULL/None, but does require wrapping it in an Option now. --- rust/src/applayer.rs | 3 +-- rust/src/applayertemplate/template.rs | 2 +- rust/src/bittorrent_dht/bittorrent_dht.rs | 2 +- rust/src/dcerpc/dcerpc.rs | 2 +- rust/src/dcerpc/dcerpc_udp.rs | 2 +- rust/src/dhcp/dhcp.rs | 2 +- rust/src/dns/dns.rs | 4 ++-- rust/src/enip/enip.rs | 2 +- rust/src/http2/http2.rs | 2 +- rust/src/ike/ike.rs | 2 +- rust/src/krb/krb5.rs | 2 +- rust/src/ldap/ldap.rs | 4 ++-- rust/src/modbus/modbus.rs | 2 +- rust/src/mqtt/mqtt.rs | 2 +- rust/src/nfs/nfs.rs | 4 ++-- rust/src/ntp/ntp.rs | 2 +- rust/src/pgsql/pgsql.rs | 2 +- rust/src/quic/quic.rs | 2 +- rust/src/rdp/rdp.rs | 2 +- rust/src/rfb/rfb.rs | 2 +- rust/src/sip/sip.rs | 2 +- rust/src/smb/smb.rs | 2 +- rust/src/snmp/snmp.rs | 2 +- rust/src/ssh/ssh.rs | 2 +- rust/src/telnet/telnet.rs | 2 +- rust/src/websocket/websocket.rs | 2 +- 26 files changed, 29 insertions(+), 30 deletions(-) diff --git a/rust/src/applayer.rs b/rust/src/applayer.rs index f863546bbe06..3f3dd026d5eb 100644 --- a/rust/src/applayer.rs +++ b/rust/src/applayer.rs @@ -369,7 +369,7 @@ pub struct RustParser { pub tx_comp_st_ts: c_int, pub tx_comp_st_tc: c_int, /// Function returning the current transaction progress - pub tx_get_progress: StateGetProgressFn, + pub tx_get_progress: crate::sys::SCAppLayerStateGetProgressFn, /// Function to get an event id from a description pub get_eventinfo: Option, @@ -443,7 +443,6 @@ pub type StateFreeFn = unsafe extern "C" fn (*mut c_void); pub type StateTxFreeFn = unsafe extern "C" fn (*mut c_void, u64); pub type StateGetTxFn = unsafe extern "C" fn (*mut c_void, u64) -> *mut c_void; pub type StateGetTxCntFn = unsafe extern "C" fn (*mut c_void) -> u64; -pub type StateGetProgressFn = unsafe extern "C" fn (*mut c_void, u8) -> c_int; pub type GetEventInfoFn = unsafe extern "C" fn (*const c_char, *mut c_int, *mut AppLayerEventType) -> c_int; pub type GetEventInfoByIdFn = unsafe extern "C" fn (c_int, *mut *const c_char, *mut AppLayerEventType) -> i8; pub type LocalStorageNewFn = extern "C" fn () -> *mut c_void; diff --git a/rust/src/applayertemplate/template.rs b/rust/src/applayertemplate/template.rs index 1580c4fdf3dd..4287fd4286ed 100644 --- a/rust/src/applayertemplate/template.rs +++ b/rust/src/applayertemplate/template.rs @@ -379,7 +379,7 @@ pub unsafe extern "C" fn rs_template_register_parser() { get_tx: rs_template_state_get_tx, tx_comp_st_ts: 1, tx_comp_st_tc: 1, - tx_get_progress: rs_template_tx_get_alstate_progress, + tx_get_progress: Some(rs_template_tx_get_alstate_progress), get_eventinfo: Some(TemplateEvent::get_event_info), get_eventinfo_byid: Some(TemplateEvent::get_event_info_by_id), localstorage_new: None, diff --git a/rust/src/bittorrent_dht/bittorrent_dht.rs b/rust/src/bittorrent_dht/bittorrent_dht.rs index f48cb3d2bf28..76509e631323 100644 --- a/rust/src/bittorrent_dht/bittorrent_dht.rs +++ b/rust/src/bittorrent_dht/bittorrent_dht.rs @@ -271,7 +271,7 @@ pub unsafe extern "C" fn rs_bittorrent_dht_udp_register_parser() { get_tx: rs_bittorrent_dht_state_get_tx, tx_comp_st_ts: 1, tx_comp_st_tc: 1, - tx_get_progress: rs_bittorrent_dht_tx_get_alstate_progress, + tx_get_progress: Some(rs_bittorrent_dht_tx_get_alstate_progress), get_eventinfo: Some(BitTorrentDHTEvent::get_event_info), get_eventinfo_byid: Some(BitTorrentDHTEvent::get_event_info_by_id), localstorage_new: None, diff --git a/rust/src/dcerpc/dcerpc.rs b/rust/src/dcerpc/dcerpc.rs index 32ebf6990134..babe19ca6026 100644 --- a/rust/src/dcerpc/dcerpc.rs +++ b/rust/src/dcerpc/dcerpc.rs @@ -1332,7 +1332,7 @@ pub unsafe extern "C" fn rs_dcerpc_register_parser() { get_tx: rs_dcerpc_get_tx, tx_comp_st_ts: 1, tx_comp_st_tc: 1, - tx_get_progress: rs_dcerpc_get_alstate_progress, + tx_get_progress: Some(rs_dcerpc_get_alstate_progress), get_eventinfo: None, get_eventinfo_byid : None, localstorage_new: None, diff --git a/rust/src/dcerpc/dcerpc_udp.rs b/rust/src/dcerpc/dcerpc_udp.rs index ab7f65cafbad..9974319f4df1 100644 --- a/rust/src/dcerpc/dcerpc_udp.rs +++ b/rust/src/dcerpc/dcerpc_udp.rs @@ -363,7 +363,7 @@ pub unsafe extern "C" fn rs_dcerpc_udp_register_parser() { get_tx: rs_dcerpc_udp_get_tx, tx_comp_st_ts: 1, tx_comp_st_tc: 1, - tx_get_progress: rs_dcerpc_get_alstate_progress, + tx_get_progress: Some(rs_dcerpc_get_alstate_progress), get_eventinfo: None, get_eventinfo_byid: None, localstorage_new: None, diff --git a/rust/src/dhcp/dhcp.rs b/rust/src/dhcp/dhcp.rs index 5b6f4b4a085a..18d3b7796da9 100644 --- a/rust/src/dhcp/dhcp.rs +++ b/rust/src/dhcp/dhcp.rs @@ -287,7 +287,7 @@ pub unsafe extern "C" fn rs_dhcp_register_parser() { get_tx : rs_dhcp_state_get_tx, tx_comp_st_ts : 1, tx_comp_st_tc : 1, - tx_get_progress : rs_dhcp_tx_get_alstate_progress, + tx_get_progress : Some(rs_dhcp_tx_get_alstate_progress), get_eventinfo : Some(DHCPEvent::get_event_info), get_eventinfo_byid : Some(DHCPEvent::get_event_info_by_id), localstorage_new : None, diff --git a/rust/src/dns/dns.rs b/rust/src/dns/dns.rs index 906f2a028859..19f8a78ab767 100644 --- a/rust/src/dns/dns.rs +++ b/rust/src/dns/dns.rs @@ -1031,7 +1031,7 @@ pub unsafe extern "C" fn SCRegisterDnsUdpParser() { get_tx: state_get_tx, tx_comp_st_ts: 1, tx_comp_st_tc: 1, - tx_get_progress: tx_get_alstate_progress, + tx_get_progress: Some(tx_get_alstate_progress), get_eventinfo: Some(DNSEvent::get_event_info), get_eventinfo_byid: Some(DNSEvent::get_event_info_by_id), localstorage_new: None, @@ -1076,7 +1076,7 @@ pub unsafe extern "C" fn SCRegisterDnsTcpParser() { get_tx: state_get_tx, tx_comp_st_ts: 1, tx_comp_st_tc: 1, - tx_get_progress: tx_get_alstate_progress, + tx_get_progress: Some(tx_get_alstate_progress), get_eventinfo: Some(DNSEvent::get_event_info), get_eventinfo_byid: Some(DNSEvent::get_event_info_by_id), localstorage_new: None, diff --git a/rust/src/enip/enip.rs b/rust/src/enip/enip.rs index 31c9152e5cab..79ffdff3ad7d 100644 --- a/rust/src/enip/enip.rs +++ b/rust/src/enip/enip.rs @@ -600,7 +600,7 @@ pub unsafe extern "C" fn SCEnipRegisterParsers() { get_tx: rs_enip_state_get_tx, tx_comp_st_ts: 1, tx_comp_st_tc: 1, - tx_get_progress: rs_enip_tx_get_alstate_progress, + tx_get_progress: Some(rs_enip_tx_get_alstate_progress), get_eventinfo: Some(EnipEvent::get_event_info), get_eventinfo_byid: Some(EnipEvent::get_event_info_by_id), localstorage_new: None, diff --git a/rust/src/http2/http2.rs b/rust/src/http2/http2.rs index 9281c011ff29..2bf681f38204 100644 --- a/rust/src/http2/http2.rs +++ b/rust/src/http2/http2.rs @@ -1539,7 +1539,7 @@ pub unsafe extern "C" fn rs_http2_register_parser() { get_tx: rs_http2_state_get_tx, tx_comp_st_ts: HTTP2TransactionState::HTTP2StateClosed as i32, tx_comp_st_tc: HTTP2TransactionState::HTTP2StateClosed as i32, - tx_get_progress: rs_http2_tx_get_alstate_progress, + tx_get_progress: Some(rs_http2_tx_get_alstate_progress), get_eventinfo: Some(HTTP2Event::get_event_info), get_eventinfo_byid: Some(HTTP2Event::get_event_info_by_id), localstorage_new: None, diff --git a/rust/src/ike/ike.rs b/rust/src/ike/ike.rs index df62c19cb4ff..dca29d4dc71e 100644 --- a/rust/src/ike/ike.rs +++ b/rust/src/ike/ike.rs @@ -413,7 +413,7 @@ pub unsafe extern "C" fn rs_ike_register_parser() { get_tx: rs_ike_state_get_tx, tx_comp_st_ts: 1, tx_comp_st_tc: 1, - tx_get_progress: rs_ike_tx_get_alstate_progress, + tx_get_progress: Some(rs_ike_tx_get_alstate_progress), get_eventinfo: Some(IkeEvent::get_event_info), get_eventinfo_byid: Some(IkeEvent::get_event_info_by_id), localstorage_new: None, diff --git a/rust/src/krb/krb5.rs b/rust/src/krb/krb5.rs index 51b215ca30d1..e6d9657565c1 100644 --- a/rust/src/krb/krb5.rs +++ b/rust/src/krb/krb5.rs @@ -598,7 +598,7 @@ pub unsafe extern "C" fn rs_register_krb5_parser() { get_tx : rs_krb5_state_get_tx, tx_comp_st_ts : 1, tx_comp_st_tc : 1, - tx_get_progress : rs_krb5_tx_get_alstate_progress, + tx_get_progress : Some(rs_krb5_tx_get_alstate_progress), get_eventinfo : Some(KRB5Event::get_event_info), get_eventinfo_byid : Some(KRB5Event::get_event_info_by_id), localstorage_new : None, diff --git a/rust/src/ldap/ldap.rs b/rust/src/ldap/ldap.rs index 4c9c3947d7a8..0cf9129a81b7 100644 --- a/rust/src/ldap/ldap.rs +++ b/rust/src/ldap/ldap.rs @@ -635,7 +635,7 @@ pub unsafe extern "C" fn SCRegisterLdapTcpParser() { get_tx: SCLdapStateGetTx, tx_comp_st_ts: 1, tx_comp_st_tc: 1, - tx_get_progress: SCLdapTxGetAlstateProgress, + tx_get_progress: Some(SCLdapTxGetAlstateProgress), get_eventinfo: Some(LdapEvent::get_event_info), get_eventinfo_byid: Some(LdapEvent::get_event_info_by_id), localstorage_new: None, @@ -692,7 +692,7 @@ pub unsafe extern "C" fn SCRegisterLdapUdpParser() { get_tx: SCLdapStateGetTx, tx_comp_st_ts: 1, tx_comp_st_tc: 1, - tx_get_progress: SCLdapTxGetAlstateProgress, + tx_get_progress: Some(SCLdapTxGetAlstateProgress), get_eventinfo: Some(LdapEvent::get_event_info), get_eventinfo_byid: Some(LdapEvent::get_event_info_by_id), localstorage_new: None, diff --git a/rust/src/modbus/modbus.rs b/rust/src/modbus/modbus.rs index 0d0c73371ef0..fa313cef9d38 100644 --- a/rust/src/modbus/modbus.rs +++ b/rust/src/modbus/modbus.rs @@ -396,7 +396,7 @@ pub unsafe extern "C" fn rs_modbus_register_parser() { get_tx: rs_modbus_state_get_tx, tx_comp_st_ts: 1, tx_comp_st_tc: 1, - tx_get_progress: rs_modbus_tx_get_alstate_progress, + tx_get_progress: Some(rs_modbus_tx_get_alstate_progress), get_eventinfo: Some(ModbusEvent::get_event_info), get_eventinfo_byid: Some(ModbusEvent::get_event_info_by_id), localstorage_new: None, diff --git a/rust/src/mqtt/mqtt.rs b/rust/src/mqtt/mqtt.rs index 4079daa6de05..1ad19b1d9fa3 100644 --- a/rust/src/mqtt/mqtt.rs +++ b/rust/src/mqtt/mqtt.rs @@ -778,7 +778,7 @@ pub unsafe extern "C" fn SCMqttRegisterParser() { get_tx: rs_mqtt_state_get_tx, tx_comp_st_ts: 1, tx_comp_st_tc: 1, - tx_get_progress: rs_mqtt_tx_get_alstate_progress, + tx_get_progress: Some(rs_mqtt_tx_get_alstate_progress), get_eventinfo: Some(MQTTEvent::get_event_info), get_eventinfo_byid: Some(MQTTEvent::get_event_info_by_id), localstorage_new: None, diff --git a/rust/src/nfs/nfs.rs b/rust/src/nfs/nfs.rs index d4b472e1f69c..528c63caa329 100644 --- a/rust/src/nfs/nfs.rs +++ b/rust/src/nfs/nfs.rs @@ -1978,7 +1978,7 @@ pub unsafe extern "C" fn rs_nfs_register_parser() { get_tx: rs_nfs_state_get_tx, tx_comp_st_ts: 1, tx_comp_st_tc: 1, - tx_get_progress: rs_nfs_tx_get_alstate_progress, + tx_get_progress: Some(rs_nfs_tx_get_alstate_progress), get_eventinfo: Some(NFSEvent::get_event_info), get_eventinfo_byid : Some(NFSEvent::get_event_info_by_id), localstorage_new: None, @@ -2055,7 +2055,7 @@ pub unsafe extern "C" fn rs_nfs_udp_register_parser() { get_tx: rs_nfs_state_get_tx, tx_comp_st_ts: 1, tx_comp_st_tc: 1, - tx_get_progress: rs_nfs_tx_get_alstate_progress, + tx_get_progress: Some(rs_nfs_tx_get_alstate_progress), get_eventinfo: Some(NFSEvent::get_event_info), get_eventinfo_byid : Some(NFSEvent::get_event_info_by_id), localstorage_new: None, diff --git a/rust/src/ntp/ntp.rs b/rust/src/ntp/ntp.rs index ae723bbb21cd..1c7674cc19a6 100644 --- a/rust/src/ntp/ntp.rs +++ b/rust/src/ntp/ntp.rs @@ -289,7 +289,7 @@ pub unsafe extern "C" fn rs_register_ntp_parser() { get_tx : rs_ntp_state_get_tx, tx_comp_st_ts : 1, tx_comp_st_tc : 1, - tx_get_progress : rs_ntp_tx_get_alstate_progress, + tx_get_progress : Some(rs_ntp_tx_get_alstate_progress), get_eventinfo : Some(NTPEvent::get_event_info), get_eventinfo_byid : Some(NTPEvent::get_event_info_by_id), localstorage_new : None, diff --git a/rust/src/pgsql/pgsql.rs b/rust/src/pgsql/pgsql.rs index 658c2326ffd5..75fe5d305a45 100644 --- a/rust/src/pgsql/pgsql.rs +++ b/rust/src/pgsql/pgsql.rs @@ -806,7 +806,7 @@ pub unsafe extern "C" fn SCRegisterPgsqlParser() { get_tx: SCPgsqlStateGetTx, tx_comp_st_ts: PgsqlTxProgress::TxDone as i32, tx_comp_st_tc: PgsqlTxProgress::TxDone as i32, - tx_get_progress: SCPgsqlTxGetALStateProgress, + tx_get_progress: Some(SCPgsqlTxGetALStateProgress), get_eventinfo: None, get_eventinfo_byid: None, localstorage_new: None, diff --git a/rust/src/quic/quic.rs b/rust/src/quic/quic.rs index bc58afe21974..f2c3e4dccdbf 100644 --- a/rust/src/quic/quic.rs +++ b/rust/src/quic/quic.rs @@ -497,7 +497,7 @@ pub unsafe extern "C" fn rs_quic_register_parser() { get_tx: rs_quic_state_get_tx, tx_comp_st_ts: 1, tx_comp_st_tc: 1, - tx_get_progress: rs_quic_tx_get_alstate_progress, + tx_get_progress: Some(rs_quic_tx_get_alstate_progress), get_eventinfo: Some(QuicEvent::get_event_info), get_eventinfo_byid: Some(QuicEvent::get_event_info_by_id), localstorage_new: None, diff --git a/rust/src/rdp/rdp.rs b/rust/src/rdp/rdp.rs index 25b5ee381a63..e14cd0522c01 100644 --- a/rust/src/rdp/rdp.rs +++ b/rust/src/rdp/rdp.rs @@ -482,7 +482,7 @@ pub unsafe extern "C" fn rs_rdp_register_parser() { get_tx: rs_rdp_state_get_tx, tx_comp_st_ts: 1, tx_comp_st_tc: 1, - tx_get_progress: rs_rdp_tx_get_progress, + tx_get_progress: Some(rs_rdp_tx_get_progress), get_eventinfo: None, get_eventinfo_byid: None, localstorage_new: None, diff --git a/rust/src/rfb/rfb.rs b/rust/src/rfb/rfb.rs index 810ed1d85d9a..b03e54f26fea 100644 --- a/rust/src/rfb/rfb.rs +++ b/rust/src/rfb/rfb.rs @@ -850,7 +850,7 @@ pub unsafe extern "C" fn SCRfbRegisterParser() { get_tx: rs_rfb_state_get_tx, tx_comp_st_ts: 1, tx_comp_st_tc: 1, - tx_get_progress: rs_rfb_tx_get_alstate_progress, + tx_get_progress: Some(rs_rfb_tx_get_alstate_progress), get_eventinfo: Some(RFBEvent::get_event_info), get_eventinfo_byid: Some(RFBEvent::get_event_info_by_id), localstorage_new: None, diff --git a/rust/src/sip/sip.rs b/rust/src/sip/sip.rs index 1a73d4e46a66..bbcd333120e1 100755 --- a/rust/src/sip/sip.rs +++ b/rust/src/sip/sip.rs @@ -559,7 +559,7 @@ pub unsafe extern "C" fn rs_sip_register_parser() { get_tx: rs_sip_state_get_tx, tx_comp_st_ts: 1, tx_comp_st_tc: 1, - tx_get_progress: rs_sip_tx_get_alstate_progress, + tx_get_progress: Some(rs_sip_tx_get_alstate_progress), get_eventinfo: Some(SIPEvent::get_event_info), get_eventinfo_byid: Some(SIPEvent::get_event_info_by_id), localstorage_new: None, diff --git a/rust/src/smb/smb.rs b/rust/src/smb/smb.rs index 0d35d6debb3e..5815a1b8fc7a 100644 --- a/rust/src/smb/smb.rs +++ b/rust/src/smb/smb.rs @@ -2299,7 +2299,7 @@ pub unsafe extern "C" fn rs_smb_register_parser() { get_tx: rs_smb_state_get_tx, tx_comp_st_ts: 1, tx_comp_st_tc: 1, - tx_get_progress: rs_smb_tx_get_alstate_progress, + tx_get_progress: Some(rs_smb_tx_get_alstate_progress), get_eventinfo: Some(rs_smb_state_get_event_info), get_eventinfo_byid : Some(rs_smb_state_get_event_info_by_id), localstorage_new: None, diff --git a/rust/src/snmp/snmp.rs b/rust/src/snmp/snmp.rs index 4e1afd0566e3..4b37905f5e8a 100644 --- a/rust/src/snmp/snmp.rs +++ b/rust/src/snmp/snmp.rs @@ -395,7 +395,7 @@ pub unsafe extern "C" fn rs_register_snmp_parser() { get_tx : rs_snmp_state_get_tx, tx_comp_st_ts : 1, tx_comp_st_tc : 1, - tx_get_progress : rs_snmp_tx_get_alstate_progress, + tx_get_progress : Some(rs_snmp_tx_get_alstate_progress), get_eventinfo : Some(SNMPEvent::get_event_info), get_eventinfo_byid : Some(SNMPEvent::get_event_info_by_id), localstorage_new : None, diff --git a/rust/src/ssh/ssh.rs b/rust/src/ssh/ssh.rs index a6a3871a8e60..185bec44d60c 100644 --- a/rust/src/ssh/ssh.rs +++ b/rust/src/ssh/ssh.rs @@ -509,7 +509,7 @@ pub unsafe extern "C" fn rs_ssh_register_parser() { get_tx: rs_ssh_state_get_tx, tx_comp_st_ts: SSHConnectionState::SshStateFinished as i32, tx_comp_st_tc: SSHConnectionState::SshStateFinished as i32, - tx_get_progress: rs_ssh_tx_get_alstate_progress, + tx_get_progress: Some(rs_ssh_tx_get_alstate_progress), get_eventinfo: Some(SSHEvent::get_event_info), get_eventinfo_byid: Some(SSHEvent::get_event_info_by_id), localstorage_new: None, diff --git a/rust/src/telnet/telnet.rs b/rust/src/telnet/telnet.rs index 29b02a9b7f41..e72de000b1c0 100644 --- a/rust/src/telnet/telnet.rs +++ b/rust/src/telnet/telnet.rs @@ -526,7 +526,7 @@ pub unsafe extern "C" fn rs_telnet_register_parser() { get_tx: rs_telnet_state_get_tx, tx_comp_st_ts: 1, tx_comp_st_tc: 1, - tx_get_progress: rs_telnet_tx_get_alstate_progress, + tx_get_progress: Some(rs_telnet_tx_get_alstate_progress), get_eventinfo: Some(TelnetEvent::get_event_info), get_eventinfo_byid : Some(TelnetEvent::get_event_info_by_id), localstorage_new: None, diff --git a/rust/src/websocket/websocket.rs b/rust/src/websocket/websocket.rs index f686ad471b42..2f96df430815 100644 --- a/rust/src/websocket/websocket.rs +++ b/rust/src/websocket/websocket.rs @@ -352,7 +352,7 @@ pub unsafe extern "C" fn rs_websocket_register_parser() { get_tx: rs_websocket_state_get_tx, tx_comp_st_ts: 1, tx_comp_st_tc: 1, - tx_get_progress: rs_websocket_tx_get_alstate_progress, + tx_get_progress: Some(rs_websocket_tx_get_alstate_progress), get_eventinfo: Some(WebSocketEvent::get_event_info), get_eventinfo_byid: Some(WebSocketEvent::get_event_info_by_id), localstorage_new: None, From e7f9983e10e91e01e857cdd4375b804d427cca37 Mon Sep 17 00:00:00 2001 From: Jason Ish Date: Wed, 23 Oct 2024 12:46:24 -0600 Subject: [PATCH 5/7] app-layer: export SCAppLayerStateGetEventInfoFn with bindgen --- rust/src/applayer.rs | 5 ++--- rust/src/build.rs | 2 ++ rust/src/core.rs | 9 ++------- rust/src/sys.rs | 2 ++ src/app-layer-ext.h | 7 +++++++ src/app-layer-parser.c | 6 +++--- src/app-layer-parser.h | 5 ++--- src/app-layer-register.h | 3 +-- src/rust.h | 1 + 9 files changed, 22 insertions(+), 18 deletions(-) diff --git a/rust/src/applayer.rs b/rust/src/applayer.rs index 3f3dd026d5eb..3ed33b88acad 100644 --- a/rust/src/applayer.rs +++ b/rust/src/applayer.rs @@ -372,7 +372,7 @@ pub struct RustParser { pub tx_get_progress: crate::sys::SCAppLayerStateGetProgressFn, /// Function to get an event id from a description - pub get_eventinfo: Option, + pub get_eventinfo: crate::sys::SCAppLayerStateGetEventInfoFn, /// Function to get an event description from an event id pub get_eventinfo_byid: Option, @@ -443,7 +443,6 @@ pub type StateFreeFn = unsafe extern "C" fn (*mut c_void); pub type StateTxFreeFn = unsafe extern "C" fn (*mut c_void, u64); pub type StateGetTxFn = unsafe extern "C" fn (*mut c_void, u64) -> *mut c_void; pub type StateGetTxCntFn = unsafe extern "C" fn (*mut c_void) -> u64; -pub type GetEventInfoFn = unsafe extern "C" fn (*const c_char, *mut c_int, *mut AppLayerEventType) -> c_int; pub type GetEventInfoByIdFn = unsafe extern "C" fn (c_int, *mut *const c_char, *mut AppLayerEventType) -> i8; pub type LocalStorageNewFn = extern "C" fn () -> *mut c_void; pub type LocalStorageFreeFn = extern "C" fn (*mut c_void); @@ -621,7 +620,7 @@ pub unsafe fn get_event_info( Ok(Some(event)) => event.as_i32(), _ => -1, }; - *event_type = core::AppLayerEventType::APP_LAYER_EVENT_TYPE_TRANSACTION; + *event_type = crate::sys::AppLayerEventType::APP_LAYER_EVENT_TYPE_TRANSACTION; *event_id = event as std::os::raw::c_int; return 0; } diff --git a/rust/src/build.rs b/rust/src/build.rs index 517851d78e2b..c69cb1fc5b27 100644 --- a/rust/src/build.rs +++ b/rust/src/build.rs @@ -12,6 +12,8 @@ fn main() { .header("../src/app-layer-ext.h") .parse_callbacks(Box::new(bindgen::CargoCallbacks::new())) .allowlist_item("SC.*") + .allowlist_item("AppLayer.*") + .rustified_enum("AppLayerEventType") .generate() .unwrap(); diff --git a/rust/src/core.rs b/rust/src/core.rs index a628b300384a..d1b1e930863e 100644 --- a/rust/src/core.rs +++ b/rust/src/core.rs @@ -25,13 +25,8 @@ use crate::debug_validate_fail; pub enum DetectEngineState {} pub enum AppLayerDecoderEvents {} -#[repr(C)] -#[derive(Debug, PartialEq, Eq, Clone, Copy)] -#[allow(non_camel_case_types)] -pub enum AppLayerEventType { - APP_LAYER_EVENT_TYPE_TRANSACTION = 1, - APP_LAYER_EVENT_TYPE_PACKET = 2, -} +/// Re-export for now. +pub use crate::sys::AppLayerEventType; pub const STREAM_START: u8 = 0x01; pub const STREAM_EOF: u8 = 0x02; diff --git a/rust/src/sys.rs b/rust/src/sys.rs index cb933dae54fe..3a0f3fd6158d 100644 --- a/rust/src/sys.rs +++ b/rust/src/sys.rs @@ -15,4 +15,6 @@ * 02110-1301, USA. */ +#![allow(non_camel_case_types)] + include!(concat!(env!("OUT_DIR"), "/bindings.rs")); diff --git a/src/app-layer-ext.h b/src/app-layer-ext.h index 5eceb863e897..fa7715ed3ce3 100644 --- a/src/app-layer-ext.h +++ b/src/app-layer-ext.h @@ -3,6 +3,13 @@ #include +typedef enum AppLayerEventType { + APP_LAYER_EVENT_TYPE_TRANSACTION = 1, + APP_LAYER_EVENT_TYPE_PACKET = 2, +} AppLayerEventType; + typedef int (*SCAppLayerStateGetProgressFn)(void *alstate, uint8_t direction); +typedef int (*SCAppLayerStateGetEventInfoFn)( + const char *event_name, int *event_id, AppLayerEventType *event_type); #endif /* SURICATA_APP_LAYER_EXT_H */ diff --git a/src/app-layer-parser.c b/src/app-layer-parser.c index c8410d41e4a8..f9c33f9268de 100644 --- a/src/app-layer-parser.c +++ b/src/app-layer-parser.c @@ -37,6 +37,7 @@ #include "util-validate.h" #include "app-layer.h" +#include "app-layer-ext.h" #include "app-layer-detect-proto.h" #include "app-layer-ftp.h" @@ -552,9 +553,8 @@ void AppLayerParserRegisterGetFrameFuncs(uint8_t ipproto, AppProto alproto, SCReturn; } -void AppLayerParserRegisterGetEventInfo(uint8_t ipproto, AppProto alproto, - int (*StateGetEventInfo)(const char *event_name, int *event_id, - AppLayerEventType *event_type)) +void AppLayerParserRegisterGetEventInfo( + uint8_t ipproto, AppProto alproto, SCAppLayerStateGetEventInfoFn StateGetEventInfo) { SCEnter(); diff --git a/src/app-layer-parser.h b/src/app-layer-parser.h index 18f5cce70f58..ceba20a47307 100644 --- a/src/app-layer-parser.h +++ b/src/app-layer-parser.h @@ -194,9 +194,8 @@ void AppLayerParserRegisterGetTxIterator(uint8_t ipproto, AppProto alproto, AppLayerGetTxIteratorFunc Func); void AppLayerParserRegisterStateProgressCompletionStatus( AppProto alproto, const int ts, const int tc); -void AppLayerParserRegisterGetEventInfo(uint8_t ipproto, AppProto alproto, - int (*StateGetEventInfo)(const char *event_name, int *event_id, - AppLayerEventType *event_type)); +void AppLayerParserRegisterGetEventInfo( + uint8_t ipproto, AppProto alproto, SCAppLayerStateGetEventInfoFn StateGetEventInfo); void AppLayerParserRegisterGetEventInfoById(uint8_t ipproto, AppProto alproto, int (*StateGetEventInfoById)(int event_id, const char **event_name, AppLayerEventType *event_type)); diff --git a/src/app-layer-register.h b/src/app-layer-register.h index 15e99707d3f7..6d74998c837a 100644 --- a/src/app-layer-register.h +++ b/src/app-layer-register.h @@ -52,8 +52,7 @@ typedef struct AppLayerParser { const int complete_tc; SCAppLayerStateGetProgressFn StateGetProgress; - int (*StateGetEventInfo)(const char *event_name, - int *event_id, AppLayerEventType *event_type); + SCAppLayerStateGetEventInfoFn StateGetEventInfo; int (*StateGetEventInfoById)(int event_id, const char **event_name, AppLayerEventType *event_type); diff --git a/src/rust.h b/src/rust.h index 03cff24c8d26..525000b1087f 100644 --- a/src/rust.h +++ b/src/rust.h @@ -21,6 +21,7 @@ // hack for include orders cf SCSha256 typedef struct HttpRangeContainerBlock HttpRangeContainerBlock; #include "rust-context.h" +#include "app-layer-ext.h" #include "rust-bindings.h" #define JB_SET_STRING(jb, key, val) jb_set_formatted((jb), "\"" key "\":\"" val "\"") From 82949057400feb2eafc09fcf7534b83ef053b34d Mon Sep 17 00:00:00 2001 From: Jason Ish Date: Wed, 23 Oct 2024 13:03:25 -0600 Subject: [PATCH 6/7] app-layer: export to SCAppLayerStateGetEventInfoByFn with bindgen Rust will now fail, as the discrepancy between i8 and i32 is picked up. --- rust/src/applayer.rs | 3 +-- src/app-layer-ext.h | 2 ++ src/app-layer-register.h | 3 +-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/rust/src/applayer.rs b/rust/src/applayer.rs index 3ed33b88acad..a7136cde0522 100644 --- a/rust/src/applayer.rs +++ b/rust/src/applayer.rs @@ -374,7 +374,7 @@ pub struct RustParser { /// Function to get an event id from a description pub get_eventinfo: crate::sys::SCAppLayerStateGetEventInfoFn, /// Function to get an event description from an event id - pub get_eventinfo_byid: Option, + pub get_eventinfo_byid: crate::sys::SCAppLayerStateGetEventInfoByIdFn, /// Function to allocate local storage pub localstorage_new: Option, @@ -443,7 +443,6 @@ pub type StateFreeFn = unsafe extern "C" fn (*mut c_void); pub type StateTxFreeFn = unsafe extern "C" fn (*mut c_void, u64); pub type StateGetTxFn = unsafe extern "C" fn (*mut c_void, u64) -> *mut c_void; pub type StateGetTxCntFn = unsafe extern "C" fn (*mut c_void) -> u64; -pub type GetEventInfoByIdFn = unsafe extern "C" fn (c_int, *mut *const c_char, *mut AppLayerEventType) -> i8; pub type LocalStorageNewFn = extern "C" fn () -> *mut c_void; pub type LocalStorageFreeFn = extern "C" fn (*mut c_void); pub type GetTxFilesFn = unsafe extern "C" fn (*mut c_void, u8) -> AppLayerGetFileState; diff --git a/src/app-layer-ext.h b/src/app-layer-ext.h index fa7715ed3ce3..36cdfa7d4bfd 100644 --- a/src/app-layer-ext.h +++ b/src/app-layer-ext.h @@ -11,5 +11,7 @@ typedef enum AppLayerEventType { typedef int (*SCAppLayerStateGetProgressFn)(void *alstate, uint8_t direction); typedef int (*SCAppLayerStateGetEventInfoFn)( const char *event_name, int *event_id, AppLayerEventType *event_type); +typedef int (*SCAppLayerStateGetEventInfoByIdFn)( + int event_id, const char **event_name, AppLayerEventType *event_type); #endif /* SURICATA_APP_LAYER_EXT_H */ diff --git a/src/app-layer-register.h b/src/app-layer-register.h index 6d74998c837a..b0a6685fc9f3 100644 --- a/src/app-layer-register.h +++ b/src/app-layer-register.h @@ -53,8 +53,7 @@ typedef struct AppLayerParser { SCAppLayerStateGetProgressFn StateGetProgress; SCAppLayerStateGetEventInfoFn StateGetEventInfo; - int (*StateGetEventInfoById)(int event_id, const char **event_name, - AppLayerEventType *event_type); + SCAppLayerStateGetEventInfoByIdFn StateGetEventInfoById; void *(*LocalStorageAlloc)(void); void (*LocalStorageFree)(void *); From 6bf01cd2cd5cea46a383ae218d67b9cab802dcd2 Mon Sep 17 00:00:00 2001 From: Jason Ish Date: Wed, 23 Oct 2024 13:11:46 -0600 Subject: [PATCH 7/7] rust: fix compile issues after change to bindgen --- rust/derive/src/applayerevent.rs | 2 +- rust/src/applayer.rs | 6 +++--- rust/src/smb/smb.rs | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/rust/derive/src/applayerevent.rs b/rust/derive/src/applayerevent.rs index c4402381120a..37e5dd0797cc 100644 --- a/rust/derive/src/applayerevent.rs +++ b/rust/derive/src/applayerevent.rs @@ -98,7 +98,7 @@ pub fn derive_app_layer_event(input: TokenStream) -> TokenStream { event_id: std::os::raw::c_int, event_name: *mut *const std::os::raw::c_char, event_type: *mut #crate_id::core::AppLayerEventType, - ) -> i8 { + ) -> std::os::raw::c_int { #crate_id::applayer::get_event_info_by_id::<#name>(event_id, event_name, event_type) } diff --git a/rust/src/applayer.rs b/rust/src/applayer.rs index a7136cde0522..927da4614847 100644 --- a/rust/src/applayer.rs +++ b/rust/src/applayer.rs @@ -18,7 +18,7 @@ //! Parser registration functions and common interface module. use std; -use crate::core::{self,DetectEngineState,Flow,AppLayerEventType,AppProto,Direction}; +use crate::core::{self,DetectEngineState,Flow,AppProto,Direction}; use crate::filecontainer::FileContainer; use std::os::raw::{c_void,c_char,c_int}; use crate::core::SC; @@ -587,7 +587,7 @@ pub trait AppLayerEvent { event_id: std::os::raw::c_int, event_name: *mut *const std::os::raw::c_char, event_type: *mut core::AppLayerEventType, - ) -> i8; + ) -> std::os::raw::c_int; } /// Generic `get_info_info` implementation for enums implementing @@ -631,7 +631,7 @@ pub unsafe fn get_event_info_by_id( event_id: std::os::raw::c_int, event_name: *mut *const std::os::raw::c_char, event_type: *mut core::AppLayerEventType, -) -> i8 { +) -> std::os::raw::c_int { if let Some(e) = T::from_id(event_id) { *event_name = e.to_cstring().as_ptr() as *const std::os::raw::c_char; *event_type = core::AppLayerEventType::APP_LAYER_EVENT_TYPE_TRANSACTION; diff --git a/rust/src/smb/smb.rs b/rust/src/smb/smb.rs index 5815a1b8fc7a..37d504d97931 100644 --- a/rust/src/smb/smb.rs +++ b/rust/src/smb/smb.rs @@ -2206,7 +2206,7 @@ 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 { +) -> std::os::raw::c_int { SMBEvent::get_event_info_by_id(event_id, event_name, event_type) }