From: Miek Gieben Date: Mon, 11 Apr 2005 11:35:19 +0000 (+0000) Subject: parsing is much more robust now. Comments are handled, multilined X-Git-Tag: release-0.50~143 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9ec56839f1bc89e024df6dd3f24643ad894dedc3;p=thirdparty%2Fldns.git parsing is much more robust now. Comments are handled, multilined soa records with ( and ) an comments are parsed correctly. some lint fixes --- diff --git a/keys.c b/keys.c index 81d2fdcc..f51019cb 100644 --- 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 */ diff --git a/ldns/parse.h b/ldns/parse.h index 1c315b15..86f628ef 100644 --- a/ldns/parse.h +++ b/ldns/parse.h @@ -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 1aafb0bb..12ac85ea 100644 --- 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 3f52eaa7..f8c8b430 100644 --- 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; } diff --git a/run-test18.c b/run-test18.c index f0b88c6e..76577390 100644 --- a/run-test18.c +++ b/run-test18.c @@ -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);