fixed reading strings containing rr with unknown number of rdata fields
char *rd;
const char *delimiters;
ssize_t c;
+ /* used for types with unknown number of rdatas */
+ bool done;
ldns_rdf *r;
uint16_t r_cnt;
r_cnt++;
}
*/
- for (r_cnt = 0; r_cnt < ldns_rr_descriptor_maximum(desc); r_cnt++) {
+ done = false;
+ for (r_cnt = 0; !done && r_cnt < ldns_rr_descriptor_maximum(desc); r_cnt++) {
/* if type = B64, the field may contain spaces */
if (ldns_rr_descriptor_field_type(desc, r_cnt) == LDNS_RDF_TYPE_B64) {
delimiters = "\n\t";
ldns_rr_descriptor_field_type(desc, r_cnt),
rd);
ldns_rr_push_rdf(new, r);
+
+ } else {
+ done = true;
}
}
}
ldns_status
ldns_str2rdf_str(ldns_rdf **rd, const char *str)
{
+ uint8_t *data;
+
if (strlen(str) > 255) {
return LDNS_STATUS_INVALID_STR;
}
- *rd = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_STR, strlen(str), str);
+
+ data = LDNS_XMALLOC(uint8_t, strlen(str) + 1);
+ data[0] = strlen(str);
+ memcpy(data + 1, str, strlen(str));
+ *rd = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_STR, strlen(str) + 1, data);
return LDNS_STATUS_OK;
}