diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/dns_decoder.cpp | 16 |
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); |
