From: Wouter Wijngaards Date: Tue, 11 Feb 2014 08:29:42 +0000 (+0000) Subject: Fix parse of #553(NSD) string in sldns, quotes without spaces. X-Git-Tag: release-1.4.22rc1~12 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=108d3b5c3c85b300722bb61071cccebff82929c1;p=thirdparty%2Funbound.git Fix parse of #553(NSD) string in sldns, quotes without spaces. git-svn-id: file:///svn/unbound/trunk@3080 be551aaa-1e26-0410-a405-d3ace91eadb9 --- diff --git a/doc/Changelog b/doc/Changelog index 44ce95324..80d9c8ea5 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,3 +1,6 @@ +11 February 2014: Wouter + - Fix parse of #553(NSD) string in sldns, quotes without spaces. + 7 February 2014: Wouter - iana portlist updated. - add body to ifstatement if locks disabled. diff --git a/ldns/parse.c b/ldns/parse.c index 1592c4c25..809bd2286 100644 --- a/ldns/parse.c +++ b/ldns/parse.c @@ -352,7 +352,11 @@ sldns_bget_token_par(sldns_buffer *b, char *token, const char *delim, return (ssize_t)i; tokenread: - sldns_bskipcs(b, del); + if(*del == '"') + /* do not skip over quotes after the string, they are part + * of the next string. But skip over whitespace (if needed)*/ + sldns_bskipcs(b, del+1); + else sldns_bskipcs(b, del); *t = '\0'; if (!par && p != 0) { diff --git a/ldns/str2wire.c b/ldns/str2wire.c index 9dd25b34f..9de146190 100644 --- a/ldns/str2wire.c +++ b/ldns/str2wire.c @@ -530,7 +530,7 @@ rrinternal_parse_rdf(sldns_buffer* strbuf, char* token, size_t token_len, */ static int sldns_parse_rdf_token(sldns_buffer* strbuf, char* token, size_t token_len, - int* quoted, int* parens, int* tokquote, size_t* pre_data_pos, + int* quoted, int* parens, size_t* pre_data_pos, const char* delimiters, sldns_rdf_type rdftype, size_t* token_strlen) { size_t slen; @@ -557,7 +557,6 @@ sldns_parse_rdf_token(sldns_buffer* strbuf, char* token, size_t token_len, token[slen-2] = 0; slen -= 2; *quoted = 1; - *tokquote = 1; /* do not read endquotechar from buffer */ } else if(!*quoted && sldns_rdf_type_maybe_quoted(rdftype) && slen >= 2 && (token[0] == '"' || token[0] == '\'')) { @@ -567,7 +566,6 @@ sldns_parse_rdf_token(sldns_buffer* strbuf, char* token, size_t token_len, token[slen-1] = 0; slen -= 1; *quoted = 1; - *tokquote = 0; /* rewind buffer over skipped whitespace */ while(sldns_buffer_position(strbuf) > 0 && (sldns_buffer_current(strbuf)[-1] == ' ' || @@ -580,7 +578,7 @@ sldns_parse_rdf_token(sldns_buffer* strbuf, char* token, size_t token_len, return 0; } slen = strlen(token); - } else *tokquote = 0; + } *token_strlen = slen; return 1; } @@ -588,7 +586,7 @@ sldns_parse_rdf_token(sldns_buffer* strbuf, char* token, size_t token_len, /** Add space and one more rdf token onto the existing token string. */ static int sldns_affix_token(sldns_buffer* strbuf, char* token, size_t* token_len, - int* quoted, int* parens, int* tokquote, size_t* pre_data_pos, + int* quoted, int* parens, size_t* pre_data_pos, const char* delimiters, sldns_rdf_type rdftype, size_t* token_strlen) { size_t addlen = *token_len - *token_strlen; @@ -602,8 +600,7 @@ sldns_affix_token(sldns_buffer* strbuf, char* token, size_t* token_len, /* read another token */ addlen = *token_len - *token_strlen; if(!sldns_parse_rdf_token(strbuf, token+*token_strlen, addlen, quoted, - parens, tokquote, pre_data_pos, delimiters, rdftype, - &addstrlen)) + parens, pre_data_pos, delimiters, rdftype, &addstrlen)) return 0; (*token_strlen) += addstrlen; return 1; @@ -618,7 +615,7 @@ rrinternal_parse_rdata(sldns_buffer* strbuf, char* token, size_t token_len, const sldns_rr_descriptor *desc = sldns_rr_descript((uint16_t)rr_type); uint16_t r_cnt, r_min, r_max; size_t rr_cur_len = dname_len + 10, pre_data_pos, token_strlen; - int was_unknown_rr_format = 0, parens = 0, status, quoted, tokquote; + int was_unknown_rr_format = 0, parens = 0, status, quoted; const char* delimiters; sldns_rdf_type rdftype; /* a desc is always returned */ @@ -638,7 +635,7 @@ rrinternal_parse_rdata(sldns_buffer* strbuf, char* token, size_t token_len, quoted = rrinternal_get_quoted(strbuf, &delimiters, rdftype); if(!sldns_parse_rdf_token(strbuf, token, token_len, "ed, - &parens, &tokquote, &pre_data_pos, delimiters, rdftype, + &parens, &pre_data_pos, delimiters, rdftype, &token_strlen)) break; @@ -659,12 +656,12 @@ rrinternal_parse_rdata(sldns_buffer* strbuf, char* token, size_t token_len, /* affix the HIT and PK fields, with a space */ if(!sldns_affix_token(strbuf, token, &token_len, "ed, &parens, - &tokquote, &pre_data_pos, delimiters, + &pre_data_pos, delimiters, rdftype, &token_strlen)) break; if(!sldns_affix_token(strbuf, token, &token_len, "ed, &parens, - &tokquote, &pre_data_pos, delimiters, + &pre_data_pos, delimiters, rdftype, &token_strlen)) break; } @@ -677,11 +674,6 @@ rrinternal_parse_rdata(sldns_buffer* strbuf, char* token, size_t token_len, return status; } } - if(quoted && !tokquote) { - if(sldns_buffer_available(strbuf, 1)) - sldns_buffer_skip(strbuf, 1); - else break; - } } if(!was_unknown_rr_format && r_cnt+1 < r_min) { return RET_ERR(LDNS_WIREPARSE_ERR_SYNTAX_MISSING_VALUE, diff --git a/testdata/test_ldnsrr.5 b/testdata/test_ldnsrr.5 index 4a14ec55d..4b1d85fa5 100644 --- a/testdata/test_ldnsrr.5 +++ b/testdata/test_ldnsrr.5 @@ -119,7 +119,6 @@ txt1 TXT "a" "bb" "ccc" txt2 TXT ( "a" "bb" "ccc" ) txt3 TXT "a b" "bb" " cc c " " " txt4 TXT ( "a b" "bb" " cc c " " " ) -txt5 TXT Test-String"Test-String" ; LOC tests abbey.example.com. 3600 IN LOC 40 32 24.716 N 105 4 25.770 W 1208.00m 600000m 2000m 1m @@ -140,3 +139,7 @@ nominnosec.example.com. 3600 IN LOC 40 0 0.000 N 105 0 0.000 W 1208.00m 1m 10000 nosec.example.com. 3600 IN LOC 40 32 0.000 N 105 4 0.000 W 1208.00m 1m 10000m 1m noszhpvp.example.com. 3600 IN LOC 40 32 24.716 N 105 4 25.770 W 1208.00m 1m 10000m 1m +; Tests for TXT quotes and parenthesis +txt5 TXT Test-String"Test-String" +txt6 IN TXT ("v=DKIM1; k=rsa; g=*; s=email; h=sha1; t=s; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC33ewKxBZARSAPbT96IpW/k3DgdNuFEb896eIf80HcVxWw+w2G+1sQcUjxWUSGp6yTTMEls6n7tthixidyRiE/aWOy3ic/K+927PuCy0M1ZX2QY8gVmOHJbYT3qBQ8toQrvGIer8fQqqJIzO/ATVbHxX8B/z0PsmGI2xxqCyXkOw""IDAQAB;") + diff --git a/testdata/test_ldnsrr.c5 b/testdata/test_ldnsrr.c5 index 72497c1ca..d6d45907a 100644 --- a/testdata/test_ldnsrr.c5 +++ b/testdata/test_ldnsrr.c5 @@ -136,8 +136,6 @@ txt2. 3600 IN TXT "a" "bb" "ccc" txt3. 3600 IN TXT "a b" "bb" " cc c " " " 0474787434000010000100000E10001003612062026262062063632063200120 txt4. 3600 IN TXT "a b" "bb" " cc c " " " -0474787435000010000100000E10001918546573742D537472696E6722546573742D537472696E6722 -txt5. 3600 IN TXT "Test-String\"Test-String\"" 056162626579076578616D706C6503636F6D00001D000100000E1000100067251288B2F08C69741F56009A6E60 abbey.example.com. 3600 IN LOC 40 32 24.716 N 105 04 25.770 W 1208m 600000m 2000m 1m 05616272616D076578616D706C6503636F6D00001D000100000E1000100015572588B2F08C69741F56FFFFFFFB @@ -172,3 +170,7 @@ nominnosec.example.com. 3600 IN LOC 40 00 00.000 N 105 00 00.000 W 1208m 1m 1000 nosec.example.com. 3600 IN LOC 40 32 00.000 N 105 04 00.000 W 1208m 1m 10000m 1m 086E6F737A68707670076578616D706C6503636F6D00001D000100000E1000100012161288B2F08C69741F56009A6E60 noszhpvp.example.com. 3600 IN LOC 40 32 24.716 N 105 04 25.770 W 1208m 1m 10000m 1m +0474787435000010000100000E10001918546573742D537472696E6722546573742D537472696E6722 +txt5. 3600 IN TXT "Test-String\"Test-String\"" +0474787436000010000100000E100108FF763D444B494D313B206B3D7273613B20673D2A3B20733D656D61696C3B20683D736861313B20743D733B20703D4D4947664D413047435371475349623344514542415155414134474E4144434269514B42675143333365774B78425A4152534150625439364970572F6B334467644E7546456238393665496638304863567857772B7732472B31735163556A785755534770367954544D456C73366E3774746869786964795269452F61574F793369632F4B2B39323750754379304D315A583251593867566D4F484A6259543371425138746F5172764749657238665171714A497A4F2F4154566248785838422F7A3050736D4749327878714379586B4F77074944415141423B +txt6. 3600 IN TXT "v=DKIM1; k=rsa; g=*; s=email; h=sha1; t=s; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC33ewKxBZARSAPbT96IpW/k3DgdNuFEb896eIf80HcVxWw+w2G+1sQcUjxWUSGp6yTTMEls6n7tthixidyRiE/aWOy3ic/K+927PuCy0M1ZX2QY8gVmOHJbYT3qBQ8toQrvGIer8fQqqJIzO/ATVbHxX8B/z0PsmGI2xxqCyXkOw" "IDAQAB;"