]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
memory fixes
authorJelte Jansen <jeltejan@NLnetLabs.nl>
Thu, 11 Aug 2005 10:13:20 +0000 (10:13 +0000)
committerJelte Jansen <jeltejan@NLnetLabs.nl>
Thu, 11 Aug 2005 10:13:20 +0000 (10:13 +0000)
ldns/parse.h
ldns/zone.h
parse.c
rr.c
signzone.c
str2host.c
zone.c

index 9a5a5aa118640199b46197a0737704955599fcce..b07546c5d7be57db75a8cf7308f51190a69dc9e9 100644 (file)
@@ -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
 
 /**
index cf704a0eab81ee2bad4ef5faeffd5eb9c3730c73..306d3381425fec3d5cd126a0cbe437295faf9cee 100644 (file)
@@ -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 2e9e8c53418a90cacc9d4b879c72e7a41dadf0a0..d2dc57d5490fb2a36f16733e19181d5ae56b987c 100644 (file)
--- 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 3790d881bd999e9c32d4326498572e8e32c88a44..ded4f77ad2f68f148e7980d840dcae0ab7627249 100644 (file)
--- 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
index 6d43c516e69bc57d29f06d466fa2b042e64c313f..75d629f6b28882d0ab3972d93fa14995f0e71219 100644 (file)
@@ -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;
 }
index dd771761412be4afeb756fcd97fc62ee11be2a4d..5f30c5c9ad53f124eca032912a8387b1db637112 100644 (file)
@@ -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 432743467f6984ebdc9fd37b1399cce553a00dfd..e81eb613ca84c7a9b1dee4f96321c355902ea242 100644 (file)
--- 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);
+}