{ LDNS_STATUS_CRYPTO_EXPIRATION_BEFORE_INCEPTION, "DNSSEC signature has expiration date earlier than inception date" },
{ LDNS_STATUS_RES_NO_NS, "No nameservers defined in the resolver" },
{ LDNS_STATUS_RES_QUERY, "No correct query given to resolver" },
+ { LDNS_STATUS_WIRE_INCOMPLETE_HEADER, "header section incomplete" },
+ { LDNS_STATUS_WIRE_INCOMPLETE_QUESTION, "question section incomplete" },
+ { LDNS_STATUS_WIRE_INCOMPLETE_ANSWER, "answer section incomplete" },
+ { LDNS_STATUS_WIRE_INCOMPLETE_AUTHORITY, "authority section incomplete" },
+ { LDNS_STATUS_WIRE_INCOMPLETE_ADDITIONAL, "additional section incomplete" },
{ 0, NULL }
};
LDNS_STATUS_CRYPTO_TSIG_ERR,
LDNS_STATUS_CRYPTO_EXPIRATION_BEFORE_INCEPTION,
LDNS_STATUS_RES_NO_NS,
- LDNS_STATUS_RES_QUERY
+ LDNS_STATUS_RES_QUERY,
+ LDNS_STATUS_WIRE_INCOMPLETE_HEADER,
+ LDNS_STATUS_WIRE_INCOMPLETE_QUESTION,
+ LDNS_STATUS_WIRE_INCOMPLETE_ANSWER,
+ LDNS_STATUS_WIRE_INCOMPLETE_AUTHORITY,
+ LDNS_STATUS_WIRE_INCOMPLETE_ADDITIONAL
};
typedef enum ldns_enum_status ldns_status;
ldns_rr_set_owner(rr, owner);
+ if (*pos + 4 > max) {
+ status = LDNS_STATUS_PACKET_OVERFLOW;
+ goto status_error;
+ }
+
ldns_rr_set_type(rr, ldns_read_uint16(&wire[*pos]));
*pos = *pos + 2;
*pos = *pos + 2;
if (section != LDNS_SECTION_QUESTION) {
+ if (*pos + 4 > max) {
+ status = LDNS_STATUS_PACKET_OVERFLOW;
+ goto status_error;
+ }
ldns_rr_set_ttl(rr, ldns_read_uint32(&wire[*pos]));
*pos = *pos + 4;
status = ldns_wire2rdf(rr, wire, max, pos);
return LDNS_STATUS_OK;
status_error:
- LDNS_FREE(rr);
+ ldns_rr_free(rr);
return status;
}
size_t *pos)
{
if (*pos + LDNS_HEADER_SIZE > max) {
- return LDNS_STATUS_PACKET_OVERFLOW;
+ return LDNS_STATUS_WIRE_INCOMPLETE_HEADER;
} else {
ldns_pkt_set_id(packet, LDNS_ID_WIRE(wire));
ldns_pkt_set_qr(packet, LDNS_QR_WIRE(wire));
status = ldns_wire2pkt_hdr(packet, wire, max, &pos);
LDNS_STATUS_CHECK_GOTO(status, status_error);
-
+
for (i = 0; i < ldns_pkt_qdcount(packet); i++) {
status = ldns_wire2rr(&rr, wire, max, &pos,
LDNS_SECTION_QUESTION);
+ if (status == LDNS_STATUS_PACKET_OVERFLOW) {
+ status = LDNS_STATUS_WIRE_INCOMPLETE_QUESTION;
+ }
LDNS_STATUS_CHECK_GOTO(status, status_error);
if (!ldns_rr_list_push_rr(ldns_pkt_question(packet), rr)) {
ldns_pkt_free(packet);
for (i = 0; i < ldns_pkt_ancount(packet); i++) {
status = ldns_wire2rr(&rr, wire, max, &pos,
LDNS_SECTION_ANSWER);
+ if (status == LDNS_STATUS_PACKET_OVERFLOW) {
+ status = LDNS_STATUS_WIRE_INCOMPLETE_ANSWER;
+ }
LDNS_STATUS_CHECK_GOTO(status, status_error);
if (!ldns_rr_list_push_rr(ldns_pkt_answer(packet), rr)) {
ldns_pkt_free(packet);
for (i = 0; i < ldns_pkt_nscount(packet); i++) {
status = ldns_wire2rr(&rr, wire, max, &pos,
LDNS_SECTION_AUTHORITY);
+ if (status == LDNS_STATUS_PACKET_OVERFLOW) {
+ status = LDNS_STATUS_WIRE_INCOMPLETE_AUTHORITY;
+ }
LDNS_STATUS_CHECK_GOTO(status, status_error);
if (!ldns_rr_list_push_rr(ldns_pkt_authority(packet), rr)) {
ldns_pkt_free(packet);
for (i = 0; i < ldns_pkt_arcount(packet); i++) {
status = ldns_wire2rr(&rr, wire, max, &pos,
LDNS_SECTION_ADDITIONAL);
+ if (status == LDNS_STATUS_PACKET_OVERFLOW) {
+ status = LDNS_STATUS_WIRE_INCOMPLETE_ADDITIONAL;
+ }
LDNS_STATUS_CHECK_GOTO(status, status_error);
if (ldns_rr_get_type(rr) == LDNS_RR_TYPE_OPT) {
ldns_pkt_set_edns_udp_size(packet, ldns_rr_get_class(rr));
return status;
status_error:
- LDNS_FREE(packet);
+ ldns_pkt_free(packet);
return status;
}