From: Jelte Jansen Date: Mon, 27 Jun 2005 13:13:42 +0000 (+0000) Subject: dname_cat modifies left hand instead of acting the same as clone (data from 2 is... X-Git-Tag: release-0.70~28 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f037cfbd3566c1839c3176b2ca7d89986b079715;p=thirdparty%2Fldns.git dname_cat modifies left hand instead of acting the same as clone (data from 2 is still copied) some memory changes --- diff --git a/dname.c b/dname.c index a1ff7af5..c9cd3f19 100644 --- a/dname.c +++ b/dname.c @@ -58,35 +58,23 @@ ldns_dname_cat_clone(ldns_rdf *rd1, ldns_rdf *rd2) * or do we modify rd1 inplace? * I guess the latter is better... MG... ? */ -ldns_rdf * +ldns_status ldns_dname_cat(ldns_rdf *rd1, ldns_rdf *rd2) { - ldns_rdf *new; - uint16_t new_size; - uint8_t *buf; + uint16_t size; if (ldns_rdf_get_type(rd1) != LDNS_RDF_TYPE_DNAME || ldns_rdf_get_type(rd2) != LDNS_RDF_TYPE_DNAME) { - return NULL; - } - - /* we overwrite the nullbyte of rd1 */ - new_size = ldns_rdf_size(rd1) + ldns_rdf_size(rd2) - 1; - buf = LDNS_XMALLOC(uint8_t, new_size); - if (!buf) { - return NULL; + return LDNS_STATUS_ERR; } - /* put the two dname's after each other */ - memcpy(buf, ldns_rdf_data(rd1), ldns_rdf_size(rd1) - 1); - memcpy(buf + ldns_rdf_size(rd1) - 1, - ldns_rdf_data(rd2), ldns_rdf_size(rd2)); - - new = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_DNAME, new_size, buf); + size = ldns_rdf_size(rd1) + ldns_rdf_size(rd2) - 1; + ldns_rdf_set_data(rd1, LDNS_XREALLOC(ldns_rdf_data(rd1), uint8_t, size)); + memcpy(ldns_rdf_data(rd1) + ldns_rdf_size(rd1) - 1, ldns_rdf_data(rd2), ldns_rdf_size(rd2)); + ldns_rdf_set_size(rd1, size); - LDNS_FREE(buf); - return new; + return LDNS_STATUS_OK; } ldns_rdf * diff --git a/ldns/dname.h b/ldns/dname.h index 09bb2fc3..2fcce14e 100644 --- a/ldns/dname.h +++ b/ldns/dname.h @@ -25,6 +25,13 @@ * \return a new rdf with leftside/rightside */ ldns_rdf *ldns_dname_cat_clone(ldns_rdf *rd1, ldns_rdf *rd2); +/** + * concatenates rd2 after rd1 (rd2 is copied, rd1 is modified) + * \param[in] rd1 the leftside + * \param[in] rd2 the rightside + * \return LDNS_STATUS_OK on success + */ +ldns_status *ldns_dname_cat(ldns_rdf *rd1, ldns_rdf *rd2); /** * chop one label off a dname. so * wwww.nlnetlabs.nl, becomes nlnetlabs.nl diff --git a/mx.c b/mx.c index 4a8c0ddb..355fdbd0 100644 --- a/mx.c +++ b/mx.c @@ -43,6 +43,7 @@ main(int argc, char *argv[]) /* create a new resolver from /etc/resolv.conf */ res = ldns_resolver_new_frm_file(NULL); + if (!res) { exit(1); } @@ -51,6 +52,9 @@ main(int argc, char *argv[]) * records of the domain given on the command line */ p = ldns_resolver_query(res, domain, LDNS_RR_TYPE_MX, LDNS_RR_CLASS_IN, LDNS_RD); + + ldns_rdf_deep_free(domain); + if (!p) { exit(1); } else { @@ -62,13 +66,18 @@ main(int argc, char *argv[]) fprintf(stderr, " *** invalid answer name %s after MX query for %s\n", argv[1], argv[1]); + ldns_pkt_free(p); + ldns_resolver_deep_free(res); exit(1); } else { /* sort the list nicely */ /* ldns_rr_list_sort(mx); */ /* print the rrlist to stdout */ ldns_rr_list_print(stdout, mx); + ldns_rr_list_deep_free(mx); } } + ldns_pkt_free(p); + ldns_resolver_deep_free(res); return 0; } diff --git a/net.c b/net.c index 323a9f98..d31e4445 100644 --- a/net.c +++ b/net.c @@ -65,6 +65,7 @@ ldns_send(ldns_pkt **result, ldns_resolver *r, ldns_pkt *query_pkt) } if (ldns_pkt2buffer_wire(qb, query_pkt) != LDNS_STATUS_OK) { + ldns_buffer_free(qb); return LDNS_STATUS_ERR; } /* random should already be setup - isn't so bad @@ -112,6 +113,7 @@ ldns_send(ldns_pkt **result, ldns_resolver *r, ldns_pkt *query_pkt) break; default: LDNS_FREE(ns); + ldns_buffer_free(qb); return LDNS_STATUS_ERR; } @@ -128,6 +130,7 @@ ldns_send(ldns_pkt **result, ldns_resolver *r, ldns_pkt *query_pkt) if (!reply_bytes) { if (ldns_resolver_fail(r)) { LDNS_FREE(ns); + ldns_buffer_free(qb); return LDNS_STATUS_ERR; } else { continue; @@ -138,6 +141,7 @@ ldns_send(ldns_pkt **result, ldns_resolver *r, ldns_pkt *query_pkt) LDNS_STATUS_OK) { LDNS_FREE(reply_bytes); LDNS_FREE(ns); + ldns_buffer_free(qb); return LDNS_STATUS_ERR; } diff --git a/packet.c b/packet.c index f2fad941..0d0f424a 100644 --- a/packet.c +++ b/packet.c @@ -285,6 +285,8 @@ ldns_pkt_rr_list_by_type(ldns_pkt *packet, ldns_rr_type type, ldns_pkt_section s ); } } + ldns_rr_list_deep_free(rrs); + if (ldns_rr_list_rr_count(new) == 0) { ldns_rr_list_free(new); return NULL; diff --git a/rr.c b/rr.c index 34fbabc6..7cc400ec 100644 --- a/rr.c +++ b/rr.c @@ -772,6 +772,7 @@ ldns_rr_list_clone(ldns_rr_list *rrlist) ); if (!r) { /* huh, failure in cloning */ + ldns_rr_list_free(new_list); return NULL; } ldns_rr_list_push_rr(new_list, r);