summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/dns.cpp125
1 files changed, 93 insertions, 32 deletions
diff --git a/src/dns.cpp b/src/dns.cpp
index 6c7508a..29ab4f7 100644
--- a/src/dns.cpp
+++ b/src/dns.cpp
@@ -110,13 +110,22 @@ const unsigned char PCAP_FILE_HEAD[24] = {0xD4, 0xC3, 0xB2, 0xA1, 0x02, 0x00, 0x
static int str2hex(unsigned char *source, int s_len, char *dest, int d_len)
{
int i=0,used_len=0;
-
+
for(i=0; i<s_len && i<d_len/2; i++)
{
used_len+=snprintf(dest+used_len, d_len-used_len, "%02x", source[i]);
}
- return 0;
+ if(used_len<d_len)
+ {
+ dest[used_len]='\0';
+ }
+ else
+ {
+ dest[used_len-1]='\0';
+ }
+
+ return used_len;
}
int dissect_type_bitmap(unsigned char *buff, int rr_len, unsigned char *maps_buff, unsigned short *maps_len)
@@ -164,7 +173,7 @@ int dissect_type_bitmap(unsigned char *buff, int rr_len, unsigned char *maps_buf
int get_rr_str2json(cJSON *object, dns_info_t *dns_info, int *dns_sec)
{
- int i=0;
+ int i=0,ret=0;
char ip_str[128];
char tmp_buff[4096]={0};
dns_rr_t *dns_rr=NULL;
@@ -253,8 +262,11 @@ int get_rr_str2json(cJSON *object, dns_info_t *dns_info, int *dns_sec)
cJSON_AddNumberToObject(one_rr_object, "protocol", dns_rr->rdata.wks.protocol);
cJSON_AddNumberToObject(one_rr_object, "size", dns_rr->rdata.wks.size);
- str2hex(dns_rr->rdata.wks.bitmap, dns_rr->rdata.wks.size, tmp_buff, sizeof(tmp_buff));
- cJSON_AddStringToObject(one_rr_object, "bitmap", tmp_buff);
+ ret=str2hex(dns_rr->rdata.wks.bitmap, dns_rr->rdata.wks.size, tmp_buff, sizeof(tmp_buff));
+ if(ret>0)
+ {
+ cJSON_AddStringToObject(one_rr_object, "bitmap", tmp_buff);
+ }
break;
case DNS_TYPE_PTR:
cJSON_AddStringToObject(one_rr_object, "ptr", (const char *)(dns_rr->rdata.ptr));
@@ -291,8 +303,11 @@ int get_rr_str2json(cJSON *object, dns_info_t *dns_info, int *dns_sec)
cJSON_AddNumberToObject(one_rr_object, "algo", dns_rr->rdata.ds.algo);
cJSON_AddNumberToObject(one_rr_object, "digest_type", dns_rr->rdata.ds.digest_type);
- str2hex(dns_rr->rdata.ds.digest, dns_rr->rdata.ds.digest_len, tmp_buff, sizeof(tmp_buff));
- cJSON_AddStringToObject(one_rr_object, "digest", tmp_buff);
+ ret=str2hex(dns_rr->rdata.ds.digest, dns_rr->rdata.ds.digest_len, tmp_buff, sizeof(tmp_buff));
+ if(ret>0)
+ {
+ cJSON_AddStringToObject(one_rr_object, "digest", tmp_buff);
+ }
break;
case DNS_TYPE_RRSIG:
*dns_sec = 2;
@@ -305,15 +320,21 @@ int get_rr_str2json(cJSON *object, dns_info_t *dns_info, int *dns_sec)
cJSON_AddNumberToObject(one_rr_object, "key_tag", dns_rr->rdata.rrsig.key_tag);
cJSON_AddStringToObject(one_rr_object, "signer_name", (const char *)(dns_rr->rdata.rrsig.signer_name));
- str2hex(dns_rr->rdata.rrsig.signature, dns_rr->rdata.rrsig.signature_len, tmp_buff, sizeof(tmp_buff));
- cJSON_AddStringToObject(one_rr_object, "signature", tmp_buff);
+ ret=str2hex(dns_rr->rdata.rrsig.signature, dns_rr->rdata.rrsig.signature_len, tmp_buff, sizeof(tmp_buff));
+ if(ret>0)
+ {
+ cJSON_AddStringToObject(one_rr_object, "signature", tmp_buff);
+ }
break;
case DNS_TYPE_NSEC:
*dns_sec = 2;
cJSON_AddStringToObject(one_rr_object, "next_domain", (const char *)(dns_rr->rdata.nsec.next_domain));
- str2hex(dns_rr->rdata.nsec.type_bit_maps, dns_rr->rdata.nsec.maps_len, tmp_buff, sizeof(tmp_buff));
- cJSON_AddStringToObject(one_rr_object, "type_bit_maps", tmp_buff);
+ ret=str2hex(dns_rr->rdata.nsec.type_bit_maps, dns_rr->rdata.nsec.maps_len, tmp_buff, sizeof(tmp_buff));
+ if(ret>0)
+ {
+ cJSON_AddStringToObject(one_rr_object, "type_bit_maps", tmp_buff);
+ }
break;
case DNS_TYPE_DNSKEY:
*dns_sec = 2;
@@ -321,8 +342,11 @@ int get_rr_str2json(cJSON *object, dns_info_t *dns_info, int *dns_sec)
cJSON_AddNumberToObject(one_rr_object, "protocol", dns_rr->rdata.dnskey.protocol);
cJSON_AddNumberToObject(one_rr_object, "algo", dns_rr->rdata.dnskey.algo);
- str2hex(dns_rr->rdata.dnskey.public_key, dns_rr->rdata.dnskey.public_key_len, tmp_buff, sizeof(tmp_buff));
- cJSON_AddStringToObject(one_rr_object, "public_key", tmp_buff);
+ ret=str2hex(dns_rr->rdata.dnskey.public_key, dns_rr->rdata.dnskey.public_key_len, tmp_buff, sizeof(tmp_buff));
+ if(ret>0)
+ {
+ cJSON_AddStringToObject(one_rr_object, "public_key", tmp_buff);
+ }
break;
case DNS_TYPE_NSEC3:
*dns_sec = 2;
@@ -332,14 +356,23 @@ int get_rr_str2json(cJSON *object, dns_info_t *dns_info, int *dns_sec)
cJSON_AddNumberToObject(one_rr_object, "salt_len", dns_rr->rdata.nsec3.salt_len);
cJSON_AddNumberToObject(one_rr_object, "hash_len", dns_rr->rdata.nsec3.hash_len);
- str2hex(dns_rr->rdata.nsec3.salt_value, dns_rr->rdata.nsec3.salt_len, tmp_buff, sizeof(tmp_buff));
- cJSON_AddStringToObject(one_rr_object, "salt_value", tmp_buff);
+ ret=str2hex(dns_rr->rdata.nsec3.salt_value, dns_rr->rdata.nsec3.salt_len, tmp_buff, sizeof(tmp_buff));
+ if(ret>0)
+ {
+ cJSON_AddStringToObject(one_rr_object, "salt_value", tmp_buff);
+ }
- str2hex(dns_rr->rdata.nsec3.next_hash_owner, dns_rr->rdata.nsec3.hash_len, tmp_buff, sizeof(tmp_buff));
- cJSON_AddStringToObject(one_rr_object, "next_hash_owner", tmp_buff);
+ ret=str2hex(dns_rr->rdata.nsec3.next_hash_owner, dns_rr->rdata.nsec3.hash_len, tmp_buff, sizeof(tmp_buff));
+ if(ret>0)
+ {
+ cJSON_AddStringToObject(one_rr_object, "next_hash_owner", tmp_buff);
+ }
- str2hex(dns_rr->rdata.nsec3.type_bit_maps, dns_rr->rdata.nsec3.maps_len, tmp_buff, sizeof(tmp_buff));
- cJSON_AddStringToObject(one_rr_object, "type_bit_maps", tmp_buff);
+ ret=str2hex(dns_rr->rdata.nsec3.type_bit_maps, dns_rr->rdata.nsec3.maps_len, tmp_buff, sizeof(tmp_buff));
+ if(ret>0)
+ {
+ cJSON_AddStringToObject(one_rr_object, "type_bit_maps", tmp_buff);
+ }
break;
case DNS_TYPE_NSEC3PARAM:
cJSON_AddNumberToObject(one_rr_object, "hash_algo", dns_rr->rdata.nsec3param.hash_algo);
@@ -347,8 +380,11 @@ int get_rr_str2json(cJSON *object, dns_info_t *dns_info, int *dns_sec)
cJSON_AddNumberToObject(one_rr_object, "iteration", dns_rr->rdata.nsec3param.iteration);
cJSON_AddNumberToObject(one_rr_object, "salt_len", dns_rr->rdata.nsec3param.salt_len);
- str2hex(dns_rr->rdata.nsec3param.salt_value, dns_rr->rdata.nsec3param.salt_len, tmp_buff, sizeof(tmp_buff));
- cJSON_AddStringToObject(one_rr_object, "salt_value", tmp_buff);
+ ret=str2hex(dns_rr->rdata.nsec3param.salt_value, dns_rr->rdata.nsec3param.salt_len, tmp_buff, sizeof(tmp_buff));
+ if(ret>0)
+ {
+ cJSON_AddStringToObject(one_rr_object, "salt_value", tmp_buff);
+ }
break;
case DNS_QTYPE_AXFR:
break;
@@ -470,8 +506,11 @@ int get_rr_content2buf(dns_rr_t *rr, int rr_count, char *rr_buf, int buflen, int
{
len += snprintf(tmp_buf+len, sizeof(tmp_buf)-len, "%02x", dns_rr->rdata.wks.bitmap[j]);
}
- used_len += snprintf(buf+used_len, buflen-used_len, "[WKS addr: %s, protocol: %u, bitmap: %s, size: %u]};",
+ if(len>0)
+ {
+ used_len += snprintf(buf+used_len, buflen-used_len, "[WKS addr: %s, protocol: %u, bitmap: %s, size: %u]};",
ip_str, dns_rr->rdata.wks.protocol, tmp_buf, dns_rr->rdata.wks.size);
+ }
break;
case DNS_TYPE_PTR:
used_len += snprintf(buf+used_len, buflen-used_len, "[PTR: %s]};", dns_rr->rdata.ptr);
@@ -510,10 +549,14 @@ int get_rr_content2buf(dns_rr_t *rr, int rr_count, char *rr_buf, int buflen, int
{
len += snprintf(tmp_buf+len, sizeof(tmp_buf)-len, "%02x", dns_rr->rdata.ds.digest[j]);
}
- used_len += snprintf(buf+used_len, buflen-used_len,
+
+ if(len>0)
+ {
+ used_len += snprintf(buf+used_len, buflen-used_len,
"[DS key_tag: %u, algo: %u, digest_type: %u, digest: %s]};",
dns_rr->rdata.ds.key_tag, dns_rr->rdata.ds.algo,
dns_rr->rdata.ds.digest_type, tmp_buf);
+ }
break;
case DNS_TYPE_RRSIG:
*dns_sec = 2;
@@ -524,12 +567,16 @@ int get_rr_content2buf(dns_rr_t *rr, int rr_count, char *rr_buf, int buflen, int
{
len += snprintf(tmp_buf+len, sizeof(tmp_buf)-len, "%02x", dns_rr->rdata.rrsig.signature[j]);
}
- used_len += snprintf(buf+used_len, buflen-used_len,
+
+ if(len>0)
+ {
+ used_len += snprintf(buf+used_len, buflen-used_len,
"[RRSIG type_covered: %u, algo: %u, labels: %u, original_ttl: %u, sig_expiration: %u, sig_inception: %u, key_tag: %u, signer_name: %s, signature: %s]};",
dns_rr->rdata.rrsig.type_covered, dns_rr->rdata.rrsig.algo,
dns_rr->rdata.rrsig.labels, dns_rr->rdata.rrsig.original_ttl,
dns_rr->rdata.rrsig.sig_expiration, dns_rr->rdata.rrsig.sig_inception,
dns_rr->rdata.rrsig.key_tag, dns_rr->rdata.rrsig.signer_name, tmp_buf);
+ }
break;
case DNS_TYPE_NSEC:
*dns_sec = 2;
@@ -539,7 +586,10 @@ int get_rr_content2buf(dns_rr_t *rr, int rr_count, char *rr_buf, int buflen, int
{
len += snprintf(maps+len, sizeof(maps)-len, "%02x", dns_rr->rdata.nsec.type_bit_maps[j]);
}
- used_len += snprintf(buf+used_len, buflen-used_len, "[NSEC next_domain: %s, type_bit_maps: %s]};", dns_rr->rdata.nsec.next_domain, maps);
+ if(len>0)
+ {
+ used_len += snprintf(buf+used_len, buflen-used_len, "[NSEC next_domain: %s, type_bit_maps: %s]};", dns_rr->rdata.nsec.next_domain, maps);
+ }
break;
case DNS_TYPE_DNSKEY:
*dns_sec = 2;
@@ -550,8 +600,11 @@ int get_rr_content2buf(dns_rr_t *rr, int rr_count, char *rr_buf, int buflen, int
{
len += snprintf(tmp_buf+len, sizeof(tmp_buf)-len, "%02x", dns_rr->rdata.dnskey.public_key[j]);
}
- used_len += snprintf(buf+used_len, buflen-used_len, "[DNSKEY flags: %u, protocol: %u, algo: %u, public_key: %s]};",
+ if(len>0)
+ {
+ used_len += snprintf(buf+used_len, buflen-used_len, "[DNSKEY flags: %u, protocol: %u, algo: %u, public_key: %s]};",
dns_rr->rdata.dnskey.flags, dns_rr->rdata.dnskey.protocol, dns_rr->rdata.dnskey.algo, tmp_buf);
+ }
break;
case DNS_TYPE_NSEC3:
*dns_sec = 2;
@@ -591,12 +644,15 @@ int get_rr_content2buf(dns_rr_t *rr, int rr_count, char *rr_buf, int buflen, int
{
len += snprintf(tmp_buf+len, sizeof(tmp_buf)-len, "%02x", dns_rr->rdata.nsec3param.salt_value[j]);
}
-
- used_len += snprintf(buf+used_len, buflen-used_len,
+
+ if(len>0)
+ {
+ used_len += snprintf(buf+used_len, buflen-used_len,
"[NSEC3PARAM hash_algo: %u, flags: %u, iteration: %u, salt_len: %u, salt_value: %s]};",
dns_rr->rdata.nsec3param.hash_algo, dns_rr->rdata.nsec3param.flags,
dns_rr->rdata.nsec3param.iteration, dns_rr->rdata.nsec3param.salt_len,
tmp_buf);
+ }
break;
case DNS_QTYPE_AXFR:
continue;
@@ -1541,8 +1597,11 @@ int get_one_resource_record(char * msg, char ** ptr, dns_rr_t * rr, char * end)
{
return -1;
}
-
- dissect_type_bitmap((unsigned char*)*ptr, rr->rdlength-len, (rr->rdata.nsec.type_bit_maps), &(rr->rdata.nsec.maps_len));
+
+ if(rr->rdlength-len>0 && rr->rdlength-len<sizeof(rr->rdata.nsec.type_bit_maps))
+ {
+ dissect_type_bitmap((unsigned char*)*ptr, rr->rdlength-len, (rr->rdata.nsec.type_bit_maps), &(rr->rdata.nsec.maps_len));
+ }
*ptr = (char *)original_ptr+rr->rdlength;
break;
case DNS_TYPE_DNSKEY:
@@ -1564,8 +1623,10 @@ int get_one_resource_record(char * msg, char ** ptr, dns_rr_t * rr, char * end)
get_rr_type_nsec3(ptr, &(rr->rdata.nsec3), end);
len=((char *)*ptr)-(char *)original_ptr;
- dissect_type_bitmap((unsigned char*)*ptr, rr->rdlength-len, (rr->rdata.nsec3.type_bit_maps), &(rr->rdata.nsec3.maps_len));
-
+ if(rr->rdlength-len>0 && rr->rdlength-len<sizeof(rr->rdata.nsec3.type_bit_maps))
+ {
+ dissect_type_bitmap((unsigned char*)*ptr, rr->rdlength-len, (rr->rdata.nsec3.type_bit_maps), &(rr->rdata.nsec3.maps_len));
+ }
*ptr = (char *)original_ptr+rr->rdlength;
break;
case DNS_TYPE_NSEC3PARAM: