From: Pieter Lexis Date: Mon, 29 Mar 2021 17:09:36 +0000 (+0200) Subject: SVCB: Fix the textwriter for escaped params X-Git-Tag: dnsdist-1.6.0-rc1~33^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5597ee55a7d5827950418d0172fd537bcf0d95e7;p=thirdparty%2Fpdns.git SVCB: Fix the textwriter for escaped params --- diff --git a/pdns/rcpgenerator.cc b/pdns/rcpgenerator.cc index 84a468f123..0acab9372c 100644 --- a/pdns/rcpgenerator.cc +++ b/pdns/rcpgenerator.cc @@ -760,8 +760,20 @@ void RecordTextWriter::xfrSVCBValueList(const vector &val) { shouldQuote = true; } string tmp = txtEscape(v); - boost::replace_all(tmp, ",", "\\\\,"); - escaped.push_back(tmp); + string unescaped; + unescaped.reserve(tmp.size() + 4); + for (auto const &ch : tmp) { + if (ch == '\\') { + unescaped += R"F(\\)F"; + continue; + } + if (ch == ',') { + unescaped += R"F(\\,)F"; + continue; + } + unescaped += ch; + } + escaped.push_back(unescaped); } if (shouldQuote) { d_string.append(1, '"'); diff --git a/pdns/test-dnsrecords_cc.cc b/pdns/test-dnsrecords_cc.cc index 9094d24ee8..ca9522b81e 100644 --- a/pdns/test-dnsrecords_cc.cc +++ b/pdns/test-dnsrecords_cc.cc @@ -233,6 +233,7 @@ BOOST_AUTO_TEST_CASE(test_record_types) { (CASE_L(QType::SVCB, "16 foo.powerdns.org. alpn=h2,h3 mandatory=alpn ipv4hint=\"192.0.2.1\"", "16 foo.powerdns.org. mandatory=alpn alpn=h2,h3 ipv4hint=192.0.2.1", "\0\x10\3foo\x08powerdns\x03org\x00\x00\x00\x00\x02\x00\x01\x00\x01\x00\x06\x02h2\x02h3\x00\x04\x00\x04\xc0\x00\x02\x01")) // Escaped ALPN value (CASE_S(QType::SVCB, R"FOO(1 foo.powerdns.org. alpn=h3\\,cool,h2)FOO", "\0\x01\3foo\x08powerdns\x03org\x00\x00\x01\x00\x0b\x07h3,cool\x02h2")) + (CASE_S(QType::SVCB, R"FOO(1 foo.powerdns.org. alpn=h\\\\3\\,cool,h2)FOO", "\0\x01\3foo\x08powerdns\x03org\x00\x00\x01\x00\x0c\x08h\\3,cool\x02h2")) // Escaped _and_ spaced ALPN value (CASE_S(QType::SVCB, R"FOO(1 foo.powerdns.org. alpn="h3\\,co ol,h2")FOO", "\0\x01\3foo\x08powerdns\x03org\x00\x00\x01\x00\x0c\x08h3,co ol\x02h2"))