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