From a1f92f24fba7823c55ebb57f2ad7e31cb02ba1d8 Mon Sep 17 00:00:00 2001 From: alandefreitas Date: Thu, 18 Aug 2022 16:37:29 -0300 Subject: [PATCH] set empty path fix #426 --- include/boost/url/detail/any_path_iter.hpp | 6 ++-- include/boost/url/impl/url_base.ipp | 42 ++++++++++++---------- test/unit/url.cpp | 4 +++ 3 files changed, 32 insertions(+), 20 deletions(-) diff --git a/include/boost/url/detail/any_path_iter.hpp b/include/boost/url/detail/any_path_iter.hpp index eafe62d0d..130476cdb 100644 --- a/include/boost/url/detail/any_path_iter.hpp +++ b/include/boost/url/detail/any_path_iter.hpp @@ -173,7 +173,8 @@ class enc_segs_iter : it_(first) , end_(last) { - front = *first; + if (it_ != end_) + front = *first; } bool @@ -241,7 +242,8 @@ class plain_segs_iter : it_(first) , end_(last) { - front = *first; + if (first != last) + front = *first; } bool diff --git a/include/boost/url/impl/url_base.ipp b/include/boost/url/impl/url_base.ipp index 677d4b0ca..291df9bfd 100644 --- a/include/boost/url/impl/url_base.ipp +++ b/include/boost/url/impl/url_base.ipp @@ -1079,21 +1079,25 @@ edit_segments( // adjust capacity reserve(size() + n - n0); - // start of output - auto dest = s_ + p0; + if (s_) + { + // start of output + auto dest = s_ + p0; - // move and size - std::memmove( - dest + n, - s_ + p1, - size() - p1); - u_.set_size( - id_path, - u_.len(id_path) - - (n0 - n)); - u_.nseg_ = nseg1; - s_[size()] = '\0'; - return dest; + // move and size + std::memmove( + dest + n, + s_ + p1, + size() - p1); + u_.set_size( + id_path, + u_.len(id_path) - + (n0 - n)); + u_.nseg_ = nseg1; + s_[size()] = '\0'; + return dest; + } + return s_; } // insert or replace [i0, i1) @@ -1148,7 +1152,7 @@ edit_segments( 2 = "./" 3 = "/./" - This is malleable prefix that might need to + This is a malleable prefix that might need to change according the URL scheme and authority. */ @@ -1193,8 +1197,10 @@ edit_segments( ':') != string_view::npos || it0.front.empty())) { - BOOST_ASSERT(nseg > 0); - prefix = 2; + if (nseg > 0) + prefix = 2; + else + prefix = 0; } else if( abs && @@ -1268,7 +1274,7 @@ edit_segments( n += prefix + suffix; auto dest = edit_segments( i0, i1, n, nseg); - auto const last = dest + n; + char const *const last = dest + n; /* Write all characters in the destination: diff --git a/test/unit/url.cpp b/test/unit/url.cpp index 612813a29..74df13b51 100644 --- a/test/unit/url.cpp +++ b/test/unit/url.cpp @@ -1425,6 +1425,10 @@ class url_test u.set_path(pct_encoded_view(s)); BOOST_TEST_EQ(u.string(), match); }; + check( + "", + "", + ""); check( "", "path/to/file.txt",