app-layer: add helper for AppLayerTxData cleanup

pull/12862/head
Victor Julien 1 year ago committed by Victor Julien
parent 8c9dfafc6d
commit 1542bcdc67

@ -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)]

@ -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);

@ -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);
}

@ -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);

@ -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);

@ -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)

Loading…
Cancel
Save