diff --git a/src/app-layer-dns-common.c b/src/app-layer-dns-common.c index 5f8e0be133..95eaf13152 100644 --- a/src/app-layer-dns-common.c +++ b/src/app-layer-dns-common.c @@ -277,6 +277,9 @@ static void DNSTransactionFree(DNSTransaction *tx, DNSState *state) AppLayerDecoderEventsFreeEvents(&tx->decoder_events); + if (tx->de_state != NULL) + DetectEngineStateFree(tx->de_state); + DNSDecrMemcap(sizeof(DNSTransaction), state); SCFree(tx); SCReturn; @@ -344,6 +347,19 @@ DNSTransaction *DNSTransactionFindByTxId(const DNSState *dns_state, const uint16 return NULL; } +DetectEngineState *DNSGetTxDetectState(void *vtx) +{ + DNSTransaction *tx = (DNSTransaction *)vtx; + return tx->de_state; +} + +int DNSSetTxDetectState(void *vtx, DetectEngineState *s) +{ + DNSTransaction *tx = (DNSTransaction *)vtx; + tx->de_state = s; + return 0; +} + void *DNSStateAlloc(void) { void *s = SCMalloc(sizeof(DNSState)); diff --git a/src/app-layer-dns-common.h b/src/app-layer-dns-common.h index ab2d8ef118..5977a74df8 100644 --- a/src/app-layer-dns-common.h +++ b/src/app-layer-dns-common.h @@ -149,6 +149,7 @@ typedef struct DNSTransaction_ { AppLayerDecoderEvents *decoder_events; /**< per tx events */ TAILQ_ENTRY(DNSTransaction_) next; + DetectEngineState *de_state; } DNSTransaction; /** \brief Per flow DNS state container */ @@ -199,6 +200,9 @@ int DNSGetAlstateProgressCompletionStatus(uint8_t direction); void DNSStateTransactionFree(void *state, uint64_t tx_id); DNSTransaction *DNSTransactionFindByTxId(const DNSState *dns_state, const uint16_t tx_id); +DetectEngineState *DNSGetTxDetectState(void *vtx); +int DNSSetTxDetectState(void *vtx, DetectEngineState *s); + void DNSSetEvent(DNSState *s, uint8_t e); void *DNSStateAlloc(void); void DNSStateFree(void *s); diff --git a/src/app-layer-dns-tcp.c b/src/app-layer-dns-tcp.c index 6b46a5a1dc..8ed1a85dcb 100644 --- a/src/app-layer-dns-tcp.c +++ b/src/app-layer-dns-tcp.c @@ -642,6 +642,8 @@ void RegisterDNSTCPParsers(void) AppLayerParserRegisterGetEventsFunc(IPPROTO_TCP, ALPROTO_DNS, DNSGetEvents); AppLayerParserRegisterHasEventsFunc(IPPROTO_TCP, ALPROTO_DNS, DNSHasEvents); + AppLayerParserRegisterDetectStateFuncs(IPPROTO_TCP, ALPROTO_DNS, + DNSGetTxDetectState, DNSSetTxDetectState); AppLayerParserRegisterGetTx(IPPROTO_TCP, ALPROTO_DNS, DNSGetTx); AppLayerParserRegisterGetTxCnt(IPPROTO_TCP, ALPROTO_DNS, DNSGetTxCnt); diff --git a/src/app-layer-dns-udp.c b/src/app-layer-dns-udp.c index feeb7de1c7..86350d0ce3 100644 --- a/src/app-layer-dns-udp.c +++ b/src/app-layer-dns-udp.c @@ -398,6 +398,8 @@ void RegisterDNSUDPParsers(void) AppLayerParserRegisterGetEventsFunc(IPPROTO_UDP, ALPROTO_DNS, DNSGetEvents); AppLayerParserRegisterHasEventsFunc(IPPROTO_UDP, ALPROTO_DNS, DNSHasEvents); + AppLayerParserRegisterDetectStateFuncs(IPPROTO_UDP, ALPROTO_DNS, + DNSGetTxDetectState, DNSSetTxDetectState); AppLayerParserRegisterGetTx(IPPROTO_UDP, ALPROTO_DNS, DNSGetTx);