From: Victor Julien Date: Sat, 22 Mar 2025 09:18:43 +0000 (+0100) Subject: app-layer: add helper for AppLayerTxData cleanup X-Git-Tag: suricata-8.0.0-beta1~186 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1542bcdc67d13932d19cc91ba5c1c80d0a7084e9;p=thirdparty%2Fsuricata.git app-layer: add helper for AppLayerTxData cleanup --- diff --git a/rust/src/applayer.rs b/rust/src/applayer.rs index 4367825727..604121c0e9 100644 --- a/rust/src/applayer.rs +++ b/rust/src/applayer.rs @@ -31,6 +31,14 @@ use crate::core::StreamingBufferConfig; pub use suricata_derive::AppLayerEvent; use suricata_sys::sys::AppProto; +/// Cast pointer to a variable, as a mutable reference to an object +/// +/// UNSAFE ! +#[macro_export] +macro_rules! cast_pointer { + ($ptr:ident, $ty:ty) => ( &mut *($ptr as *mut $ty) ); +} + #[repr(C)] pub struct StreamSlice { input: *const u8, @@ -142,6 +150,18 @@ impl Default for AppLayerTxData { impl Drop for AppLayerTxData { fn drop(&mut self) { + self.cleanup(); + } +} + +#[no_mangle] +pub unsafe extern "C" fn SCAppLayerTxDataCleanup(txd: *mut AppLayerTxData) { + let txd = cast_pointer!(txd, AppLayerTxData); + txd.cleanup() +} + +impl AppLayerTxData { + pub fn cleanup(&mut self) { if !self.de_state.is_null() { core::sc_detect_engine_state_free(self.de_state); } @@ -149,9 +169,7 @@ impl Drop for AppLayerTxData { core::sc_app_layer_decoder_events_free_events(&mut self.events); } } -} -impl AppLayerTxData { /// Create new AppLayerTxData for a transaction that covers both /// directions. pub fn new() -> Self { @@ -421,14 +439,6 @@ macro_rules! build_slice { ($buf:ident, $len:expr) => ( std::slice::from_raw_parts($buf, $len) ); } -/// Cast pointer to a variable, as a mutable reference to an object -/// -/// UNSAFE ! -#[macro_export] -macro_rules! cast_pointer { - ($ptr:ident, $ty:ty) => ( &mut *($ptr as *mut $ty) ); -} - /// helper for the GetTxFilesFn. Not meant to be embedded as the config /// pointer is passed around in the API. #[allow(non_snake_case)] diff --git a/src/app-layer-dnp3.c b/src/app-layer-dnp3.c index a1daf3a2e1..9d1bc126cf 100644 --- a/src/app-layer-dnp3.c +++ b/src/app-layer-dnp3.c @@ -1327,11 +1327,7 @@ static void DNP3TxFree(DNP3Transaction *tx) SCFree(tx->buffer); } - AppLayerDecoderEventsFreeEvents(&tx->tx_data.events); - - if (tx->tx_data.de_state != NULL) { - DetectEngineStateFree(tx->tx_data.de_state); - } + SCAppLayerTxDataCleanup(&tx->tx_data); DNP3TxFreeObjectList(&tx->objects); diff --git a/src/app-layer-ftp.c b/src/app-layer-ftp.c index d07b6290b9..4c173297c1 100644 --- a/src/app-layer-ftp.c +++ b/src/app-layer-ftp.c @@ -238,9 +238,7 @@ static void FTPTransactionFree(FTPTransaction *tx) { SCEnter(); - if (tx->tx_data.de_state != NULL) { - DetectEngineStateFree(tx->tx_data.de_state); - } + SCAppLayerTxDataCleanup(&tx->tx_data); if (tx->request) { FTPFree(tx->request, tx->request_length); @@ -252,10 +250,6 @@ static void FTPTransactionFree(FTPTransaction *tx) FTPStringFree(str); } - if (tx->tx_data.events) { - AppLayerDecoderEventsFreeEvents(&tx->tx_data.events); - } - FTPFree(tx, sizeof(*tx)); } @@ -1137,9 +1131,8 @@ static void FTPDataStateFree(void *s) { FtpDataState *fstate = (FtpDataState *) s; - if (fstate->tx_data.de_state != NULL) { - DetectEngineStateFree(fstate->tx_data.de_state); - } + SCAppLayerTxDataCleanup(&fstate->tx_data); + if (fstate->file_name != NULL) { FTPFree(fstate->file_name, fstate->file_len + 1); } diff --git a/src/app-layer-htp.c b/src/app-layer-htp.c index d88cab6b48..7293e8671c 100644 --- a/src/app-layer-htp.c +++ b/src/app-layer-htp.c @@ -364,12 +364,9 @@ static void HtpTxUserDataFree(HtpState *state, HtpTxUserData *htud) HTPFree(htud->request_headers_raw, htud->request_headers_raw_len); if (htud->response_headers_raw) HTPFree(htud->response_headers_raw, htud->response_headers_raw_len); - AppLayerDecoderEventsFreeEvents(&htud->tx_data.events); if (htud->mime_state) SCMimeStateFree(htud->mime_state); - if (htud->tx_data.de_state != NULL) { - DetectEngineStateFree(htud->tx_data.de_state); - } + SCAppLayerTxDataCleanup(&htud->tx_data); if (htud->file_range) { HTPFileCloseHandleRange(&htp_sbcfg, &htud->files_tc, 0, htud->file_range, NULL, 0); HttpRangeFreeBlock(htud->file_range); diff --git a/src/app-layer-smtp.c b/src/app-layer-smtp.c index 6d48753827..35d51c7f6a 100644 --- a/src/app-layer-smtp.c +++ b/src/app-layer-smtp.c @@ -1573,11 +1573,7 @@ static void SMTPTransactionFree(SMTPTransaction *tx, SMTPState *state) SCMimeSmtpStateFree(tx->mime_state); } - if (tx->tx_data.events != NULL) - AppLayerDecoderEventsFreeEvents(&tx->tx_data.events); - - if (tx->tx_data.de_state != NULL) - DetectEngineStateFree(tx->tx_data.de_state); + SCAppLayerTxDataCleanup(&tx->tx_data); if (tx->mail_from) SCFree(tx->mail_from); diff --git a/src/app-layer-ssl.c b/src/app-layer-ssl.c index 2f24dae140..e3a6312205 100644 --- a/src/app-layer-ssl.c +++ b/src/app-layer-ssl.c @@ -2945,11 +2945,7 @@ static void SSLStateFree(void *p) SSLStateCertSANFree(&ssl_state->server_connp); SSLStateCertSANFree(&ssl_state->client_connp); - AppLayerDecoderEventsFreeEvents(&ssl_state->tx_data.events); - - if (ssl_state->tx_data.de_state != NULL) { - DetectEngineStateFree(ssl_state->tx_data.de_state); - } + SCAppLayerTxDataCleanup(&ssl_state->tx_data); /* Free certificate chain */ if (ssl_state->server_connp.certs_buffer)