diff --git a/src/convert.c b/src/convert.c index adb97136..dc5968af 100644 --- a/src/convert.c +++ b/src/convert.c @@ -45,42 +45,35 @@ /* stuff to make it compile pedantically */ #define UNUSED_PARAM(x) ((void)(x)) -static size_t sizeof_dname(uint8_t *dname) +getdns_return_t +getdns_convert_dns_name_to_fqdn( + const struct getdns_bindata *dns_name_wire_fmt, char **fqdn_as_string) { - uint8_t *ptr; - - assert(dname); - ptr = dname; - while (*ptr && (*ptr & 0xC0) == 0) - ptr += *ptr + 1; - if ((*ptr & 0xC0) == 0xC0) - ptr++; - return (ptr - dname) + 1; -} - -char * -getdns_convert_dns_name_to_fqdn(const char *name_from_dns_response) -{ - char *str; ldns_rdf *rdf = ldns_rdf_new(LDNS_RDF_TYPE_DNAME, - sizeof_dname((uint8_t *)name_from_dns_response), - (void *)name_from_dns_response); /* unconst is safe here */ - if (!rdf) return NULL; - str = ldns_rdf2str(rdf); + dns_name_wire_fmt->size, + (void *)dns_name_wire_fmt->data); /* unconst is safe here */ + if (!rdf) return GETDNS_RETURN_MEMORY_ERROR; + *fqdn_as_string = ldns_rdf2str(rdf); ldns_rdf_free(rdf); - return str; + return *fqdn_as_string ? GETDNS_RETURN_GOOD + : GETDNS_RETURN_GENERIC_ERROR; } -char * -getdns_convert_fqdn_to_dns_name(const char *fqdn_as_string) +getdns_return_t +getdns_convert_fqdn_to_dns_name( + const char *fqdn_as_string, struct getdns_bindata **dns_name_wire_fmt) { ldns_rdf *rdf; - char *data; if (ldns_str2rdf_dname(&rdf, fqdn_as_string) != LDNS_STATUS_OK) - return NULL; - data = (char *)ldns_rdf_data(rdf); + return GETDNS_RETURN_GENERIC_ERROR;; + *dns_name_wire_fmt = malloc(sizeof(struct getdns_bindata)); + if (*dns_name_wire_fmt) { + (*dns_name_wire_fmt)->size = ldns_rdf_size(rdf); + (*dns_name_wire_fmt)->data = ldns_rdf_data(rdf); + } ldns_rdf_free(rdf); - return data; + return *dns_name_wire_fmt ? GETDNS_RETURN_GOOD + : GETDNS_RETURN_MEMORY_ERROR; } /*---------------------------------------- getdns_convert_alabel_to_ulabel */ diff --git a/src/dict.c b/src/dict.c index 326bdd83..cd3ea10c 100644 --- a/src/dict.c +++ b/src/dict.c @@ -542,8 +542,9 @@ getdns_pp_bindata(ldns_buffer * buf, size_t indent, return -1; } else if (priv_getdns_bindata_is_dname(bindata)) { - dname = getdns_convert_dns_name_to_fqdn((char *)bindata->data); - if (ldns_buffer_printf(buf, "for %s>", dname) < 0) { + if (GETDNS_RETURN_GOOD == + getdns_convert_dns_name_to_fqdn(bindata, &dname) && + ldns_buffer_printf(buf, "for %s>", dname) < 0) { free(dname); return -1; } diff --git a/src/getdns/getdns.h b/src/getdns/getdns.h index dfd21a1c..e2bee268 100644 --- a/src/getdns/getdns.h +++ b/src/getdns/getdns.h @@ -840,9 +840,15 @@ getdns_service_sync(struct getdns_context *context, /** @} */ -char *getdns_convert_dns_name_to_fqdn(const char *name_from_dns_response); +getdns_return_t +getdns_convert_dns_name_to_fqdn( + const struct getdns_bindata *dns_name_wire_fmt, + char **fqdn_as_string); -char *getdns_convert_fqdn_to_dns_name(const char *fqdn_as_string); +getdns_return_t +getdns_convert_fqdn_to_dns_name( + const char *fqdn_as_string, + struct getdns_bindata **dns_name_wire_fmt); char *getdns_convert_ulabel_to_alabel(const char *ulabel);