summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/dns_decoder.cpp16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/dns_decoder.cpp b/src/dns_decoder.cpp
index f726d53..70fba40 100644
--- a/src/dns_decoder.cpp
+++ b/src/dns_decoder.cpp
@@ -1171,6 +1171,12 @@ void dns_decoder_session_transaction_add(struct dns_decoder_context *per_ss_ctx,
void dns_decoder_session_transaction_del(struct dns_decoder_context *per_ss_ctx, struct dns_transaction *current_trans)
{
+ if(per_ss_ctx->trans_list_head==NULL || current_trans==NULL)
+ {
+ assert(per_ss_ctx->trans_list_num==0);
+ return ;
+ }
+
DL_DELETE(per_ss_ctx->trans_list_head, current_trans);
per_ss_ctx->trans_list_num--;
@@ -1224,7 +1230,6 @@ void dns_decoder_entry(struct session *ss, uint8_t *payload, size_t payload_sz,
data_msg->n_authority_rr=dns_hdr.aucount;
data_msg->n_additional_rr=dns_hdr.adcount;
- data_msg->type=((dns_hdr.qr==0) ? DNS_MESSAGE_QUERY : DNS_MESSAGE_RESPONSE);
if(data_msg->n_question==1)
{
size_t tag_offset=4;
@@ -1245,8 +1250,10 @@ void dns_decoder_entry(struct session *ss, uint8_t *payload, size_t payload_sz,
struct dns_decoder_context *per_ss_ctx=(struct dns_decoder_context *)per_session_ctx;
int32_t message_id=data_msg->trans_identifier_id;
+ enum dns_message_type msg_type=((dns_hdr.qr==0) ? DNS_MESSAGE_QUERY : DNS_MESSAGE_RESPONSE);
+
HASH_FIND_INT(per_ss_ctx->trans_hash, &message_id, current_trans);
- if(current_trans!=NULL && data_msg->type==DNS_MESSAGE_QUERY)
+ if(current_trans!=NULL && msg_type==DNS_MESSAGE_QUERY)
{
dns_message_transaction_publish(ss, DNS_MESSAGE_TRANSACTION_END, plugin_env->dns.topic_id, current_trans->trans_idx);
dns_decoder_session_transaction_del(per_ss_ctx, current_trans);
@@ -1273,6 +1280,7 @@ void dns_decoder_entry(struct session *ss, uint8_t *payload, size_t payload_sz,
}
data_msg->ss=ss;
+ data_msg->type=msg_type;
data_msg->payload=payload;
data_msg->payload_sz=payload_sz;
data_msg->payload_offset=payload_offset;
@@ -1282,12 +1290,12 @@ void dns_decoder_entry(struct session *ss, uint8_t *payload, size_t payload_sz,
session_mq_publish_message(ss, plugin_env->dns.topic_id, data_msg);
size_t tag_offset=4;
- const char *type=((data_msg->type==DNS_MESSAGE_RESPONSE) ? "response" : "query");
+ const char *type=((msg_type==DNS_MESSAGE_RESPONSE) ? "response" : "query");
const char *tag_key[tag_offset]={TAG_KEY_IP_VERSION, TAG_KEY_IP_PROTOCOL, TAG_KEY_MESSAGE_TYPE, TAG_KEY_MESSAGE_STATUS};
const char *tag_value[tag_offset]={ip_version, ip_protocol, type, "normal"};
dns_decoder_local_file_counter_incby(plugin_env, LOCAL_STAT_COUNTER_SEND, tag_key, tag_value, tag_offset, 1, session_get_current_thread_id(ss));
- if(data_msg->type==DNS_MESSAGE_RESPONSE)
+ if(msg_type==DNS_MESSAGE_RESPONSE)
{
dns_message_transaction_publish(ss, DNS_MESSAGE_TRANSACTION_END, plugin_env->dns.topic_id, current_trans->trans_idx);
dns_decoder_session_transaction_del(per_ss_ctx, current_trans);