On Mon, Sep 14, 2026 at 09:44:37AM +0100, 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".

I did mention update-patches at the conference, but there was a lot
of material for someone new to the art of OpenBSD porting.

> -- 
>  Sent from a phone, apologies for poor formatting.
> 
> On 13 September 2026 20:34:36 Sergii Rudchenko <[email protected]> wrote:
> 
> > The current version of the Boost C++ library in OpenBSD ports (1.91.0)
> > has an
> > annoying regression in Boost.URL: https://github.com/boostorg/url/issues/989
> > 
> > The issue is fixed upstream and released in in 1.92.0:
> > https://github.com/boostorg/url/commit/41b467a389a68321608138a432b15024b6c11918
> > 
> > After talking to Marc Espie at EuroBSDCon I understood that that
> > updating boost
> > to 1.92.0 is at this point in the release cycle is risky and will most
> > likely
> > be postponed until 8.0 is out. He suggested to try backporting the fix
> > for the
> > time being.
> > 
> > Below is the patch taken as-is from the upstream and it luckily applies
> > cleanly
> > on top of 1.91.0. I have verified the fix on the resulting build from
> > the port.
> > 
> > Can we please apply this stopgap measure until we move to 1.92.0?
> > 
> > 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    13 Sep 2026 18:07:29 -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-libs_url_base_edit_params
> > ===================================================================
> > RCS file: devel/boost/patches/patch-libs_url_base_edit_params
> > diff -N devel/boost/patches/patch-libs_url_base_edit_params
> > --- /dev/null    1 Jan 1970 00:00:00 -0000
> > +++ devel/boost/patches/patch-libs_url_base_edit_params    13 Sep 2026
> > 18:07:29 -0000
> > @@ -0,0 +1,140 @@
> > +Backport the fix for the URL corruption bug on url.params().append() in
> > Boost 1.91.0
> > +
> > +Fixed upstream in 1.92.0: 41b467a389a68321608138a432b15024b6c11918
> > +Index: boost/include/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: 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: 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;
> > +@@ -814,6 +819,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");
> > ++        }
> > +     }
> > +
> > +     static
> 

Reply via email to