Allow to set empty bindata's

quite common in OPT record's rdata_raw
This commit is contained in:
Willem Toorop 2014-10-30 15:08:42 +01:00
parent fafbcee2d4
commit 0daa5b573d
2 changed files with 29 additions and 18 deletions

View File

@ -1662,33 +1662,41 @@ struct getdns_bindata *
getdns_bindata_copy(struct mem_funcs *mfs, getdns_bindata_copy(struct mem_funcs *mfs,
const struct getdns_bindata *src) const struct getdns_bindata *src)
{ {
struct getdns_bindata *dst; /* Don't know why, but nodata allows
* empty bindatas with the python bindings
*/
static uint8_t nodata[] = { 0, 0, 0, 0, 0, 0, 0, 0 };
struct getdns_bindata *dst;
if (!src) if (!src)
return NULL; return NULL;
dst = GETDNS_MALLOC(*mfs, struct getdns_bindata); if (!(dst = GETDNS_MALLOC(*mfs, struct getdns_bindata)))
if (!dst) return NULL;
return NULL;
dst->size = src->size; dst->size = src->size;
dst->data = GETDNS_XMALLOC(*mfs, uint8_t, src->size); if ((dst->size = src->size)) {
if (!dst->data) { dst->data = GETDNS_XMALLOC(*mfs, uint8_t, src->size);
GETDNS_FREE(*mfs, dst); if (!dst->data) {
return NULL; GETDNS_FREE(*mfs, dst);
} return NULL;
(void) memcpy(dst->data, src->data, src->size); }
return dst; (void) memcpy(dst->data, src->data, src->size);
} else {
dst->data = nodata;
}
return dst;
} }
void void
getdns_bindata_destroy(struct mem_funcs *mfs, getdns_bindata_destroy(struct mem_funcs *mfs,
struct getdns_bindata *bindata) struct getdns_bindata *bindata)
{ {
if (!bindata) if (!bindata)
return; return;
GETDNS_FREE(*mfs, bindata->data);
GETDNS_FREE(*mfs, bindata); if (bindata->size) GETDNS_FREE(*mfs, bindata->data);
GETDNS_FREE(*mfs, bindata);
} }
/* TODO: Remove next_timeout argument from getdns_context_get_num_pending_requests /* TODO: Remove next_timeout argument from getdns_context_get_num_pending_requests

View File

@ -1350,6 +1350,7 @@ getdns_return_t priv_getdns_append_opt_rr(
rdata.size = ldns_rdf_size(edns_data); rdata.size = ldns_rdf_size(edns_data);
rdata.data = ldns_rdf_data(edns_data); rdata.data = ldns_rdf_data(edns_data);
} else { } else {
if (!(opt_rr = getdns_dict_create_with_context(context))) if (!(opt_rr = getdns_dict_create_with_context(context)))
r |= GETDNS_RETURN_GENERIC_ERROR; r |= GETDNS_RETURN_GENERIC_ERROR;
@ -1363,11 +1364,13 @@ getdns_return_t priv_getdns_append_opt_rr(
r |= getdns_dict_set_list(opt_rr, "options", options); r |= getdns_dict_set_list(opt_rr, "options", options);
getdns_list_destroy(options); getdns_list_destroy(options);
} }
/* add data */ /* add data */
r |= getdns_dict_set_bindata(opt_rr, "rdata_raw", &rdata); r |= getdns_dict_set_bindata(opt_rr, "rdata_raw", &rdata);
r |= getdns_dict_set_dict(rr_dict, "rdata", opt_rr); r |= getdns_dict_set_dict(rr_dict, "rdata", opt_rr);
getdns_dict_destroy(opt_rr); getdns_dict_destroy(opt_rr);
/* add rest of the fields */ /* add rest of the fields */
r |= getdns_dict_set_int(rr_dict, "type", GETDNS_RRTYPE_OPT); r |= getdns_dict_set_int(rr_dict, "type", GETDNS_RRTYPE_OPT);
r |= getdns_dict_set_int(rr_dict, "udp_payload_size", r |= getdns_dict_set_int(rr_dict, "udp_payload_size",