From: Jelte Jansen Date: Thu, 11 Aug 2005 10:13:20 +0000 (+0000) Subject: memory fixes X-Git-Tag: release-1.0.0~307 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=232dbb8f563576d3b4e2ba0342c213ae154c3487;p=thirdparty%2Fldns.git memory fixes --- diff --git a/ldns/parse.h b/ldns/parse.h index 9a5a5aa1..b07546c5 100644 --- a/ldns/parse.h +++ b/ldns/parse.h @@ -16,7 +16,7 @@ #define LDNS_PARSE_SKIP_SPACE "\f\n\r\v" #define LDNS_PARSE_NORMAL " \f\n\r\t\v" #define LDNS_PARSE_NO_NL " \t" -#define LDNS_MAX_LINELEN 512 +#define LDNS_MAX_LINELEN 4096 #define LDNS_MAX_KEYWORDLEN 32 /** diff --git a/ldns/zone.h b/ldns/zone.h index cf704a0e..306d3381 100644 --- a/ldns/zone.h +++ b/ldns/zone.h @@ -96,4 +96,16 @@ bool ldns_zone_rr_is_glue(ldns_zone *z, ldns_rr *rr); ldns_zone * ldns_zone_new_frm_fp(FILE *fp, ldns_rdf *origin, uint16_t ttl, ldns_rr_class c); +/** + * Frees the allocated memory for the zone, and the rr_list structure in it + */ +void ldns_zone_free(ldns_zone *zone); + +/** + * Frees the allocated memory for the zone, the soa rr in it, + * and the rr_list structure in it, including the rr's in that. etc. + */ +void ldns_zone_free(ldns_zone *zone); + + #endif /* LDNS_ZONE_H */ diff --git a/parse.c b/parse.c index 2e9e8c53..d2dc57d5 100644 --- a/parse.c +++ b/parse.c @@ -139,7 +139,7 @@ ldns_fget_token(FILE *f, char *token, const char *delim, size_t limit) *t++ = c; i++; - if (limit > 0 && i > limit) { + if (limit > 0 && i >= limit) { *t = '\0'; return -1; } @@ -280,7 +280,7 @@ ldns_bget_token(ldns_buffer *b, char *token, const char *delim, size_t limit) *t++ = c; i++; - if (limit > 0 && i > limit) { + if (limit > 0 && i >= limit - 1) { *t = '\0'; return -1; } diff --git a/rr.c b/rr.c index 3790d881..ded4f77a 100644 --- a/rr.c +++ b/rr.c @@ -179,7 +179,7 @@ ldns_rr_new_frm_str(const char *str, uint16_t default_ttl, ldns_rdf *origin) */ if (clas_val == 0) { clas_val = LDNS_RR_CLASS_IN; - type = LDNS_XMALLOC(char, strlen(ttl)); + type = LDNS_XMALLOC(char, strlen(ttl) + 1); strncpy(type, ttl, strlen(ttl) + 1); } } else { @@ -199,7 +199,7 @@ ldns_rr_new_frm_str(const char *str, uint16_t default_ttl, ldns_rdf *origin) */ if (clas_val == 0) { clas_val = LDNS_RR_CLASS_IN; - type = LDNS_XMALLOC(char, strlen(clas)); + type = LDNS_XMALLOC(char, strlen(clas) + 1); strncpy(type, clas, strlen(clas) + 1); } } @@ -329,7 +329,7 @@ ldns_rr_new_frm_str(const char *str, uint16_t default_ttl, ldns_rdf *origin) r = ldns_rdf_new_frm_str(LDNS_RDF_TYPE_HEX, hex_data_str); /* correct the rdf type */ ldns_rdf_set_type(r, ldns_rr_descriptor_field_type(desc, r_cnt)); - + LDNS_FREE(hex_data_str); ldns_rr_push_rdf(new, r); } else { @@ -357,6 +357,7 @@ ldns_rr * ldns_rr_new_frm_fp(FILE *fp, uint16_t ttl, ldns_rdf *origin) { char *line; + ldns_rr *rr; line = LDNS_XMALLOC(char, LDNS_MAX_LINELEN + 1); if (!line) { @@ -367,7 +368,11 @@ ldns_rr_new_frm_fp(FILE *fp, uint16_t ttl, ldns_rdf *origin) if (ldns_fget_token(fp, line, LDNS_PARSE_SKIP_SPACE, LDNS_MAX_LINELEN) == -1) { return NULL; } - return ldns_rr_new_frm_str((const char*) line, ttl, origin); + + rr = ldns_rr_new_frm_str((const char*) line, ttl, origin); + + LDNS_FREE(line); + return rr; } void diff --git a/signzone.c b/signzone.c index 6d43c516..75d629f6 100644 --- a/signzone.c +++ b/signzone.c @@ -66,14 +66,13 @@ main(int argc, char *argv[]) ldns_rr_print(stdout, orig_soa); ldns_rr_list_print(stdout, orig_rrs); - ldns_rr_free(orig_soa); - ldns_rr_list_free(orig_rrs); + ldns_zone_deep_free(orig_zone); } fclose(zonefile); } - ldns_rdf_free(origin); + ldns_rdf_deep_free(origin); return 0; } diff --git a/str2host.c b/str2host.c index dd771761..5f30c5c9 100644 --- a/str2host.c +++ b/str2host.c @@ -275,6 +275,7 @@ ldns_str2rdf_str(ldns_rdf **rd, const char *str) data[0] = strlen(str); memcpy(data + 1, str, strlen(str)); *rd = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_STR, strlen(str) + 1, data); + LDNS_FREE(data); return LDNS_STATUS_OK; } @@ -338,6 +339,7 @@ ldns_str2rdf_hex(ldns_rdf **rd, const char *str) } t = t_orig; *rd = ldns_rdf_new_frm_data(LDNS_RDF_TYPE_HEX, len / 2, t); + LDNS_FREE(t); } return LDNS_STATUS_OK; } diff --git a/zone.c b/zone.c index 43274346..e81eb613 100644 --- a/zone.c +++ b/zone.c @@ -83,9 +83,9 @@ ldns_zone_new_frm_fp(FILE *fp, ldns_rdf *origin, uint16_t ttl, ldns_rr_class c) { ldns_zone *newzone; ldns_rr *rr; - ldns_rdf *my_origin; - uint16_t my_ttl; - ldns_rr_class my_class; + ldns_rdf *my_origin = origin; + uint16_t my_ttl = ttl; + ldns_rr_class my_class = c; uint8_t i; @@ -100,25 +100,27 @@ ldns_zone_new_frm_fp(FILE *fp, ldns_rdf *origin, uint16_t ttl, ldns_rr_class c) i = 0; do { - rr = ldns_rr_new_frm_fp(fp, ttl, origin); + rr = ldns_rr_new_frm_fp(fp, my_ttl, my_origin); i++; } while (!rr && i <= 9); if (i > 9) { /* there is a lot of crap here, bail out before somebody gets * hurt */ + ldns_rr_free(rr); return NULL; } if (ldns_rr_get_type(rr) != LDNS_RR_TYPE_SOA) { /* first rr MUST be the soa */ + ldns_rr_free(rr); return NULL; } ldns_zone_set_soa(newzone, rr); while(!feof(fp)) { - rr = ldns_rr_new_frm_fp(fp, ttl, origin); + rr = ldns_rr_new_frm_fp(fp, my_ttl, my_origin); if (rr) { if (!ldns_zone_push_rr(newzone, rr)) { printf("error pushing rr\n"); @@ -129,6 +131,8 @@ ldns_zone_new_frm_fp(FILE *fp, ldns_rdf *origin, uint16_t ttl, ldns_rr_class c) my_ttl = ldns_rr_ttl(rr); my_class = ldns_rr_get_class(rr); + } else { + fprintf(stderr, "Error in file, unable to read RR\n"); } } return newzone; @@ -149,3 +153,16 @@ ldns_zone_ixfr_del_add(ldns_zone *z, ldns_rr_list *del, ldns_rr_list *add) } #endif + +void +ldns_zone_free(ldns_zone *zone) { + ldns_rr_list_free(zone->_rrs); + LDNS_FREE(zone); +} + +void +ldns_zone_deep_free(ldns_zone *zone) { + ldns_rr_free(zone->_soa); + ldns_rr_list_deep_free(zone->_rrs); + LDNS_FREE(zone); +}