On 9/14/26 10:44 AM, Stuart Henderson wrote:
> please use "make update-patches" to generate the patch files; from what you
> have now, "make clean; make patch; rm
> patches/patch-libs_url_base_edit_params; make update-patches".

Thank you, the updated ports diff is below.

I am not sure if it is worth including the patches for units tests as they have
no effect on the resulting package. Leaving it to the committer to decide
whether to delete patch-libs_url_test_unit_params_encoded_ref_cpp and
patch-libs_url_test_unit_params_ref_cpp.


Index: devel/boost/Makefile
===================================================================
RCS file: /cvs/ports/devel/boost/Makefile,v
diff -u -p -u -r1.163 Makefile
--- devel/boost/Makefile    18 May 2026 05:48:17 -0000    1.163
+++ devel/boost/Makefile    14 Sep 2026 12:20:34 -0000
@@ -6,6 +6,7 @@ COMMENT-main=    free peer-reviewed portabl
 COMMENT-md=    machine-dependent libraries for boost

 VERSION=    1.91.0
+REVISION=    0
 DISTNAME=    boost_${VERSION:S/./_/g}
 PKGNAME=    boost-${VERSION}
 EPOCH=        0
Index: devel/boost/patches/patch-boost_url_impl_url_base_hpp
===================================================================
RCS file: devel/boost/patches/patch-boost_url_impl_url_base_hpp
diff -N devel/boost/patches/patch-boost_url_impl_url_base_hpp
--- /dev/null    1 Jan 1970 00:00:00 -0000
+++ devel/boost/patches/patch-boost_url_impl_url_base_hpp    14 Sep 2026 12:20:34 -0000
@@ -0,0 +1,49 @@
+A temporary backport of upstream bugfix:
+  41b467a389a68321608138a432b15024b6c11918
+
+Delete on update to 1.92.0
+
+Index: boost/url/impl/url_base.hpp
+--- boost/url/impl/url_base.hpp.orig
++++ boost/url/impl/url_base.hpp
+@@ -3159,7 +3159,12 @@ edit_params(
+     BOOST_ASSERT(pos1 <= impl_.offset(id_frag));
+
+     // calc decoded size of old range,
+-    // minus one if '?' or '&' prefixed
++    // minus one for the leading '?' which is
++    // not counted in decoded_[id_query].
++    // dn0 may be -1 here when the old range is
++    // empty and the query was non-empty; the
++    // matching subtraction on dn below cancels
++    // that out when the delta is taken.
+     auto dn0 =
+         static_cast<std::ptrdiff_t>(
+             detail::decode_bytes_unsafe(
+@@ -3168,8 +3173,6 @@ edit_params(
+                     pos1 - pos0)));
+     if(impl_.len(id_query) > 0)
+         dn0 -= 1;
+-    if(dn0 < 0)
+-        dn0 = 0;
+
+ //------------------------------------------------
+ //
+@@ -3267,16 +3270,13 @@ edit_params(
+         }
+     }
+
+-    // calc decoded size of new range,
+-    // minus one if '?' or '&' prefixed
++    // calc decoded size of new range; see dn0.
+     auto dn =
+         static_cast<std::ptrdiff_t>(
+             detail::decode_bytes_unsafe(
+                 core::string_view(dest0, dest - dest0)));
+     if(impl_.len(id_query) > 0)
+         dn -= 1;
+-    if(dn < 0)
+-        dn = 0;
+
+     if(dn >= dn0)
+         impl_.decoded_[id_query] +=
Index: devel/boost/patches/patch-libs_url_test_unit_params_encoded_ref_cpp
===================================================================
RCS file: devel/boost/patches/patch-libs_url_test_unit_params_encoded_ref_cpp
diff -N devel/boost/patches/patch-libs_url_test_unit_params_encoded_ref_cpp
--- /dev/null    1 Jan 1970 00:00:00 -0000
+++ devel/boost/patches/patch-libs_url_test_unit_params_encoded_ref_cpp   14 Sep 2026 12:20:34 -0000
@@ -0,0 +1,20 @@
+A temporary backport of upstream bugfix:
+  41b467a389a68321608138a432b15024b6c11918
+
+Delete on update to 1.92.0
+
+Index: libs/url/test/unit/params_encoded_ref.cpp
+--- libs/url/test/unit/params_encoded_ref.cpp.orig
++++ libs/url/test/unit/params_encoded_ref.cpp
+@@ -121,6 +121,11 @@ struct params_encoded_ref_test
+         params_encoded_ref ps(u.encoded_params());
+         f(ps);
+         BOOST_TEST_EQ(u.encoded_query(), s1);
++        BOOST_TEST_EQ(
++            u.encoded_query().decoded_size(),
++            pct_string_view(s1).decoded_size());
++        BOOST_TEST_NO_THROW(u.encoded_target());
++        BOOST_TEST_NO_THROW(u.encoded_resource());
+         if(! BOOST_TEST_EQ(
+                 ps.size(), init.size()))
+             return;
Index: devel/boost/patches/patch-libs_url_test_unit_params_ref_cpp
===================================================================
RCS file: devel/boost/patches/patch-libs_url_test_unit_params_ref_cpp
diff -N devel/boost/patches/patch-libs_url_test_unit_params_ref_cpp
--- /dev/null    1 Jan 1970 00:00:00 -0000
+++ devel/boost/patches/patch-libs_url_test_unit_params_ref_cpp 14 Sep 2026 12:20:34 -0000
@@ -0,0 +1,83 @@
+A temporary backport of upstream bugfix:
+  41b467a389a68321608138a432b15024b6c11918
+
+Delete on update to 1.92.0
+
+Index: libs/url/test/unit/params_ref.cpp
+--- libs/url/test/unit/params_ref.cpp.orig
++++ libs/url/test/unit/params_ref.cpp
+@@ -142,6 +142,11 @@ struct params_ref_test
+         params_ref ps(u.params());
+         f(ps);
+         BOOST_TEST_EQ(u.encoded_query(), s1);
++        BOOST_TEST_EQ(
++            u.encoded_query().decoded_size(),
++            pct_string_view(s1).decoded_size());
++        BOOST_TEST_NO_THROW(u.encoded_target());
++        BOOST_TEST_NO_THROW(u.encoded_resource());
+         if(! BOOST_TEST_EQ(
+                 ps.size(), init.size()))
+             return;
+@@ -813,6 +818,62 @@ struct params_ref_test
+             };
+             check(f, "?k0&k1=&k2=key", "k0&k1=" BIGSTR "&k2=key",
+                 { {"k0",no_value}, {"k1",BIGSTR}, {"k2","key"} });
++        }
++
++        // issue #989: encoded_target() asserts after
++        // successive params().set() on a fresh url.
++        // Regression for broken decoded_[id_query]
++        // bookkeeping in url_base::edit_params.
++        {
++            url u;
++            u.params().set("a", "b");
++            BOOST_TEST_EQ(u.encoded_query(), "a=b");
++            BOOST_TEST_EQ(u.encoded_query().decoded_size(), 3u);
++            BOOST_TEST_EQ(u.encoded_target(), "?a=b");
++
++            u.params().set("c", "d");
++            BOOST_TEST_EQ(u.encoded_query(), "a=b&c=d");
++            BOOST_TEST_EQ(u.encoded_query().decoded_size(), 7u);
++            BOOST_TEST_EQ(u.encoded_target(), "?a=b&c=d");
++        }
++
++        // Related: erase first param must leave a
++        // consistent decoded_[id_query].
++        {
++            url u("?a=b&c=d");
++            BOOST_TEST_EQ(u.encoded_query().decoded_size(), 7u);
++            u.params().erase(u.params().begin());
++            BOOST_TEST_EQ(u.encoded_query(), "c=d");
++            BOOST_TEST_EQ(u.encoded_query().decoded_size(), 3u);
++            BOOST_TEST_EQ(u.encoded_target(), "?c=d");
++        }
++
++        // Related: erase last param must leave a
++        // consistent decoded_[id_query].
++        {
++            url u("?a=b&c=d");
++            u.params().erase(std::next(u.params().begin()));
++            BOOST_TEST_EQ(u.encoded_query(), "a=b");
++            BOOST_TEST_EQ(u.encoded_query().decoded_size(), 3u);
++            BOOST_TEST_EQ(u.encoded_target(), "?a=b");
++        }
++
++        // Related: insert at front of non-empty query.
++        {
++            url u("?x=y");
++            u.params().insert(u.params().begin(), {"a", "b"});
++            BOOST_TEST_EQ(u.encoded_query(), "a=b&x=y");
++            BOOST_TEST_EQ(u.encoded_query().decoded_size(), 7u);
++            BOOST_TEST_EQ(u.encoded_target(), "?a=b&x=y");
++        }
++
++        // Related: append to non-empty query.
++        {
++            url u("?x=y");
++            u.params().append({"a", "b"});
++            BOOST_TEST_EQ(u.encoded_query(), "x=y&a=b");
++            BOOST_TEST_EQ(u.encoded_query().decoded_size(), 7u);
++            BOOST_TEST_EQ(u.encoded_target(), "?x=y&a=b");
+         }
+     }
+

Reply via email to