]> git.ipfire.org Git - thirdparty/ldns.git/commitdiff
parsing is much more robust now. Comments are handled, multilined
authorMiek Gieben <miekg@NLnetLabs.nl>
Mon, 11 Apr 2005 11:35:19 +0000 (11:35 +0000)
committerMiek Gieben <miekg@NLnetLabs.nl>
Mon, 11 Apr 2005 11:35:19 +0000 (11:35 +0000)
soa records with ( and ) an comments are parsed correctly.

some lint fixes

keys.c
ldns/parse.h
parse.c
rr.c
run-test18.c

diff --git a/keys.c b/keys.c
index 81d2fdcc4342d9775984779a1e416fa7e346891b..f51019cb00a6dfbb13c115ac35db3fe4a4490504 100644 (file)
--- a/keys.c
+++ b/keys.c
@@ -327,7 +327,7 @@ ldns_key_dsa2bin(unsigned char *data, DSA *k, uint16_t *size)
 {
        uint8_t T;
        /* See RFC2536 */
-       *size = BN_num_bytes(k->g);
+       *size = (uint16_t)BN_num_bytes(k->g);
        T = (*size - 64) / 8;
        memcpy(data, &T, 1);
 
@@ -338,7 +338,7 @@ ldns_key_dsa2bin(unsigned char *data, DSA *k, uint16_t *size)
        }
 
        /**size = 64 + (T * 8); */
-       data[0] = T;
+       data[0] = (unsigned char)T;
        BN_bn2bin(k->q, data + 1 );             /* 20 octects */
        BN_bn2bin(k->p, data + 21 );            /* offset octects */
        BN_bn2bin(k->g, data + 21 + *size);     /* offset octets */
index 1c315b156bd64d33078bebbcdf9ca3ee1c4637bb..86f628efcf3373d337766a73ecad9ef94446681d 100644 (file)
@@ -55,4 +55,10 @@ ssize_t ldns_bget_token(ldns_buffer *b, char *token, const char *delim, size_t l
 ssize_t 
 ldns_bget_keyword_data(ldns_buffer *b, const char *keyword, const char *k_del, char *data, const char *d_del);
 
+/* remove comments from a string. Comment = ';' until \n
+ * replace ; until \n with spaces
+ * return the new string
+ */
+char * ldns_str_remove_comment(char *str);
+
 #endif /*  _PARSE_H_ */
diff --git a/parse.c b/parse.c
index 1aafb0bbab7d869c7f265ec573497a371f06bb4c..12ac85ea67557202ff5e92142b4bcb5f087cbcaa 100644 (file)
--- a/parse.c
+++ b/parse.c
@@ -260,3 +260,28 @@ tokenread:
        }
        return (ssize_t)i;
 }
+
+char *
+ldns_str_remove_comment(char *str)
+{
+       char *s;
+       int comment;
+       char *str2;
+
+       comment = 0;
+       str2 = strdup(str);
+
+       for(s = str2; *s; s++) {
+               if (*s == ';')  {
+                       comment = 1;
+               }
+               if (*s == '\n') {
+                       *s = ' ';
+                       comment = 0;
+               }
+               if (comment == 1) {
+                       *s = ' ';
+               }
+       }
+       return str2;
+}
diff --git a/rr.c b/rr.c
index 3f52eaa720a423c038ea1e2b944acd4c77d0859d..f8c8b4309246400c29bc41ade82de29157cb130d 100644 (file)
--- a/rr.c
+++ b/rr.c
@@ -112,7 +112,8 @@ ldns_rr_new_frm_str(const char *str)
        char  *type;
        char  *rdata;
        char  *rd;
-       int c;
+       char  *no_comment_str;
+       ssize_t c;
        
        ldns_rdf *r;
        uint16_t r_cnt;
@@ -137,18 +138,21 @@ ldns_rr_new_frm_str(const char *str)
        ttl_val = 0;
        clas_val = 0;
 
-       ldns_buffer_new_frm_data(rr_buf, (char*)str, strlen(str));
+       no_comment_str = ldns_str_remove_comment((char*)str);
+
+       ldns_buffer_new_frm_data(rr_buf, no_comment_str, strlen(no_comment_str));
        
        /* split the rr in its parts -1 signals trouble */
        if (ldns_bget_token(rr_buf, owner, "\t\n ", MAX_DOMAINLEN) == -1) {
                FREE(owner); FREE(ttl); FREE(clas); FREE(rdata);FREE(rd);
                FREE(rd_buf);
-               /* ldns_buffer_free(rr_buf); */
+               ldns_buffer_free(rr_buf); 
                return NULL;
        }
        if (ldns_bget_token(rr_buf, ttl, "\t\n ", 21) == -1) {
                FREE(owner); FREE(ttl); FREE(clas); FREE(rdata);FREE(rd);
                FREE(rd_buf);
+               ldns_buffer_free(rr_buf);
                return NULL;
        }
        ttl_val = ldns_str2period(ttl, &endptr); /* i'm not using endptr */
@@ -163,11 +167,9 @@ ldns_rr_new_frm_str(const char *str)
                clas_val = ldns_get_rr_class_by_name(ttl);
        } else {
                if (ldns_bget_token(rr_buf, clas, "\t\n ", 11) == -1) {
-#if 0
                        FREE(owner); FREE(ttl); FREE(clas); FREE(rdata);FREE(rd);
                        FREE(rd_buf);
                        ldns_buffer_free(rr_buf);
-#endif
                        return NULL;
                }
                clas_val = ldns_get_rr_class_by_name(clas);
@@ -183,7 +185,7 @@ ldns_rr_new_frm_str(const char *str)
        if (ldns_bget_token(rr_buf, rdata, "\0", MAX_PACKETLEN) == -1) {
                FREE(owner); FREE(ttl); FREE(clas); FREE(type);FREE(rd);
                FREE(rd_buf);
-               /* ldns_buffer_free(rr_buf); */
+               ldns_buffer_free(rr_buf);
                return NULL;
        }
        ldns_buffer_new_frm_data(
@@ -220,31 +222,12 @@ ldns_rr_new_frm_str(const char *str)
                                r = ldns_rdf_new_frm_str(
                                                ldns_rr_descriptor_field_type(desc, r_cnt),
                                                rd);
-#if 0
-                               if (!r || (r_cnt > r_max)) {
-                                       FREE(rdata);
-                                       return NULL;
-                               }
-#endif
-
                                ldns_rr_push_rdf(new, r);
                                r_cnt++;
                        }
        }
        
-#if 0
-       /* the last one - in case of EOF of the rdata */
-       r = ldns_rdf_new_frm_str(
-                       ldns_rr_descriptor_field_type(desc, r_cnt),
-                       rd);
-       if (!r) {
-               FREE(rdata);
-               return NULL;
-       } else {
-               ldns_rr_push_rdf(new, r);
-       }
        FREE(rdata);
-#endif
        return new;
 }
 
index f0b88c6e19ce51f2087c6c7b3102a0088c7d93d9..76577390ff8bbd13de3651bc92f8055186d35b3e 100644 (file)
@@ -45,18 +45,18 @@ main()
        printf("\n");
 
        soa_string1 = "miek.nl. 3600 IN SOA elektron.atoom.net. miekg.atoom.net. ( \
-2002120700 \n\
+2002120700 ; hallo ik ben miek\n\
 21600      \n\
 7200       \n\
 604800     \n\
 3600       \n\
 )";
        soa_string2 = "miek.nl. 3600 IN SOA elektron.atoom.net. miekg.atoom.net. \
-2002120700 \n\
-21600 \n\
-7200 \n\
-604800 \n\
-3600"; 
+2002120700 ; serial \n\
+21600 ; more shit\n\
+7200 ; ahh retry \n\
+604800 ; meaningless number to annoy me\n\
+3600 ; negative caching"; 
 
        rr = ldns_rr_new_frm_str(soa_string1);
        ldns_rr_print(stdout, rr);