]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
app-layer: add helper for AppLayerTxData cleanup
authorVictor Julien <vjulien@oisf.net>
Sat, 22 Mar 2025 09:18:43 +0000 (10:18 +0100)
committerVictor Julien <victor@inliniac.net>
Sat, 29 Mar 2025 05:38:03 +0000 (06:38 +0100)
rust/src/applayer.rs
src/app-layer-dnp3.c
src/app-layer-ftp.c
src/app-layer-htp.c
src/app-layer-smtp.c
src/app-layer-ssl.c

index 4367825727ae18760012dbfa44d73c709667fa8e..604121c0e9ee77bdd456a1ba607e962f1ecd8f5c 100644 (file)
@@ -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)]
index a1daf3a2e1a4c8a3f5ed2a3b387a9d0b1390ff8d..9d1bc126cf3e71347b6e18c3621016b03a78fb77 100644 (file)
@@ -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);
 
index d07b6290b97754313e8e1b17eb3bb4dcf411ce68..4c173297c1fcc5b2e496f61cc6cb8e5e6cf5fa5a 100644 (file)
@@ -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);
     }
index d88cab6b487aa2727839adb5507257b23954788e..7293e8671c73ba4b9cf7058e68a37413273cd919 100644 (file)
@@ -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);
index 6d4875382700ea7eaf7f816ba9b42fe4409d0765..35d51c7f6ac3a67731d4fc8e2930bc11e906c975 100644 (file)
@@ -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);
index 2f24dae140e24d40ea79716ccd988fb060a9b0e3..e3a631220522bd21910e466863c119fcb7d1f6d1 100644 (file)
@@ -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)