]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
add better URI template checking
authorTCY16 <tom@nlnetlabs.nl>
Thu, 25 Aug 2022 12:06:13 +0000 (14:06 +0200)
committerTCY16 <tom@nlnetlabs.nl>
Thu, 25 Aug 2022 12:06:13 +0000 (14:06 +0200)
sldns/str2wire.c
sldns/wire2str.c
testdata/svcb.tdir/svcb.success-cases.zone
testdata/svcb.tdir/svcb.success-cases.zone.cmp

index 90648245b560105652d641188ee6f80d944453a2..d210e6cd052a48f4e6e993b322a1d4d0455f82e8 100644 (file)
@@ -1525,7 +1525,9 @@ sldns_str2wire_svcbparam_dohpath_value(const char* val,
        uint8_t* rd, size_t* rd_len)
 {
        size_t val_len;
-       char* open_bracket, * close_bracket, * expr_ptr;
+       char* open_bracket, * close_bracket;
+       const char* next_char;
+       uint8_t expr_found = 0;
 
        /* RFC6570#section-2.1
         * "The characters outside of expressions in a URI Template string are
@@ -1541,19 +1543,36 @@ sldns_str2wire_svcbparam_dohpath_value(const char* val,
        }
 
        /* draft-ietf-add-svcb-dns-06#section-5.1
-        * The URI Template MUST contain a "dns" variable
+        * "The URI Template MUST contain a "dns" variable"
+        * A URI Template is alowed to have multiple variables
         */
-       open_bracket = strchr(val, '{');
-       close_bracket = strchr(val, '}');
+       next_char = val;
+       while (next_char && *next_char != '\0') {
+               char* c;
 
-       if (!open_bracket && !close_bracket) {
-               return LDNS_WIREPARSE_ERR_SVCB_NO_DNS_VAR_IN_DOHPATH;   
-       } else {
-               expr_ptr = strstr(open_bracket+1, "?dns");
+               open_bracket = strchr(next_char, '{');
+               if (!open_bracket) {
+                       return LDNS_WIREPARSE_ERR_SVCB_NO_DNS_VAR_IN_DOHPATH;
+                       break;
+               }
 
-               if (!expr_ptr || !((close_bracket - expr_ptr) >= 4 ) ) {
+               close_bracket = strchr(open_bracket, '}');
+               if (!close_bracket) {
                        return LDNS_WIREPARSE_ERR_SVCB_NO_DNS_VAR_IN_DOHPATH;
+
                }
+               for (c = open_bracket+1; (close_bracket - c) >= 4; c++) {
+                       if (c[0] == '?' && c[1] == 'd' && c[2] == 'n'
+                               && c[3] == 's') {
+                               expr_found++;
+                       }
+               }
+
+               next_char = close_bracket+1;
+       }
+
+       if (expr_found != 1) {
+               return LDNS_WIREPARSE_ERR_SVCB_NO_DNS_VAR_IN_DOHPATH;
        }
 
        sldns_write_uint16(rd, SVCB_KEY_DOHPATH);
index 75753f910a575c7031d2777311aa31b8fb2a40d8..5bb13f03b9e3215cd384a24d2bdfb71b2b625e4e 100644 (file)
@@ -172,7 +172,7 @@ static sldns_lookup_table sldns_wireparse_errors_data[] = {
        { LDNS_WIREPARSE_ERR_SVCB_NO_DEFAULT_ALPN_VALUE,
                "No-default-alpn should not have a value" },
        { LDNS_WIREPARSE_ERR_SVCB_NO_DNS_VAR_IN_DOHPATH,
-               "Dohpath must have '?dns' in the URI template variable" },
+               "Dohpath must contain a correct URI template variable which contains '?dns'" },
        { LDNS_WIREPARSE_ERR_SVCPARAM_BROKEN_RDATA,
                "General SVCParam error" },
        { 0, NULL }
index f625c6c5e1ca0bd8b3e11e45b86ee3dccb1c7872..fbe1fcb5f70afe77f0d90ceda3488bf40c92a6a6 100644 (file)
@@ -49,5 +49,6 @@ s09     HTTPS   0 . ( alpn="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 ; dohpath can be (non-)quoted and MUST contain "?dns"
 
 _dns.doh.example. 7200 IN SVCB 1 doh.example. alpn=h2 dohpath="/dns-query{?dns}"
-_dns.doh.example. 7200 IN SVCB 1 doh.example. alpn=h2 dohpath=/dns-query{?dns}
+_dns.doh.example. 7200 IN SVCB 1 doh.example. alpn=h2 dohpath=/dns-query{?abcd}{!abcd}{?dns}
+_dns.doh.example. 7200 IN SVCB 1 doh.example. alpn=h2 dohpath=/dns-query{?abcdabcd?dns?defedf}
 _dns.doh.example. 7200 IN SVCB 1 doh.example. alpn=h2 dohpath=/dns-queryéè{?dns}
index 9075cc6b51a2ad8e95ce10f057aaee250aee3c34..91ea71682300723f739ad8b927d89f9389663dfe 100644 (file)
@@ -9,5 +9,6 @@ s07.success-cases.      3600    IN      HTTPS   0 . ech="aGVsbG93b3JsZCE="
 s08.success-cases.     3600    IN      HTTPS   0 . key11="a" key12="a" key13="a" key14="a" key15="a" key16="a" key17="a" key18="a" key19="a" key110="a" key111="a" key112="a" key113="a" key114="a" key115="a" key116="a" key117="a" key118="a" key119="a" key120="a" key121="a" key122="a" key123="a" key124="a" key125="a" key126="a" key127="a" key128="a" key129="a" key130="a" key131="a" key132="a" key133="a" key134="a" key135="a" key136="a" key137="a" key138="a" key139="a" key140="a" key141="a" key142="a" key143="a" key144="a" key145="a" key146="a" key147="a" key148="a" key149="a" key150="a" key151="a" key152="a" key153="a" key154="a" key155="a" key156="a" key157="a" key158="a" key159="a" key160="a" key161="a" key162="a" key163="a"
 s09.success-cases.     3600    IN      HTTPS   0 . alpn="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
 _dns.doh.example.      7200    IN      SVCB    1 doh.example. alpn="h2" dohpath="/dns-query{?dns}"
-_dns.doh.example.      7200    IN      SVCB    1 doh.example. alpn="h2" dohpath="/dns-query{?dns}"
+_dns.doh.example.      7200    IN      SVCB    1 doh.example. alpn="h2" dohpath="/dns-query{?abcd}{!abcd}{?dns}"
+_dns.doh.example.      7200    IN      SVCB    1 doh.example. alpn="h2" dohpath="/dns-query{?abcdabcd?dns?defedf}"
 _dns.doh.example.      7200    IN      SVCB    1 doh.example. alpn="h2" dohpath="/dns-query\195\169\195\168{?dns}"