summaryrefslogtreecommitdiff
path: root/src/dns_decoder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/dns_decoder.cpp')
-rw-r--r--src/dns_decoder.cpp26
1 files changed, 24 insertions, 2 deletions
diff --git a/src/dns_decoder.cpp b/src/dns_decoder.cpp
index 23a0ccf..c48cf85 100644
--- a/src/dns_decoder.cpp
+++ b/src/dns_decoder.cpp
@@ -501,6 +501,8 @@ int32_t dns_resource_record_hinfo_decode(uint8_t *payload, size_t payload_sz, si
ret=dns_read_variable_dstring(payload, payload_sz, payload_offset, &(hinfo->cpu), cpu_sz);
if(ret==DNS_DECODER_FALSE)
{
+ hinfo->cpu.value_sz=0;
+ hinfo->cpu.value[0]='\0';
return DNS_DECODER_FALSE;
}
@@ -514,6 +516,8 @@ int32_t dns_resource_record_hinfo_decode(uint8_t *payload, size_t payload_sz, si
ret=dns_read_variable_dstring(payload, payload_sz, payload_offset, &(hinfo->os), os_sz);
if(ret==DNS_DECODER_FALSE)
{
+ hinfo->os.value_sz=0;
+ hinfo->os.value[0]='\0';
return DNS_DECODER_FALSE;
}
@@ -958,10 +962,28 @@ int32_t dns_resource_record_specific_field_decode(uint8_t *payload, size_t paylo
ret=dns_resource_record_soa_decode(payload, payload_sz, &offset, &(rr->rdata.soa), rr->rdlength);
break;
case DNS_RR_TYPE_A:
- ret=dns_read_variable_dstring(payload, payload_sz, &offset, &(rr->rdata.a), sizeof(uint32_t));
+ rr->rdata.a.addr_str_len=0;
+ if(payload_sz>=offset+4)
+ {
+ memcpy(&(rr->rdata.a.addr), payload+offset, 4);
+ ret=DNS_DECODER_TRUE;
+ }
+ else
+ {
+ ret=DNS_DECODER_FALSE;
+ }
break;
case DNS_RR_TYPE_AAAA:
- ret=dns_read_variable_dstring(payload, payload_sz, &offset, &(rr->rdata.aaaa), 16);
+ rr->rdata.aaaa.addr_str_len=0;
+ if(payload_sz>=offset+16)
+ {
+ memcpy(rr->rdata.aaaa.addr, payload+offset, 16);
+ ret=DNS_DECODER_TRUE;
+ }
+ else
+ {
+ ret=DNS_DECODER_FALSE;
+ }
break;
case DNS_RR_TYPE_ISDN:
ret=dns_read_variable_dstring(payload, payload_sz, &offset, &(rr->rdata.isdn), sizeof(uint8_t));