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,
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);
}
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 {
($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)]
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);
{
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);
FTPStringFree(str);
}
- if (tx->tx_data.events) {
- AppLayerDecoderEventsFreeEvents(&tx->tx_data.events);
- }
-
FTPFree(tx, sizeof(*tx));
}
{
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);
}
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);
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);
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)