dev-util/ostree: fix crash w/ net-misc/curl-8.10.1

I'll leave the bump to maintainers.

Closes: https://bugs.gentoo.org/939813
Signed-off-by: Sam James <sam@gentoo.org>
This commit is contained in:
Sam James
2024-09-20 07:14:30 +01:00
parent 2d0958ddc6
commit c1a6000b2c
2 changed files with 180 additions and 0 deletions

View File

@@ -0,0 +1,58 @@
https://bugs.gentoo.org/939813
https://github.com/ostreedev/ostree/pull/3307
From 4d755a85225ea0a02d4580d088bb8a97138cb040 Mon Sep 17 00:00:00 2001
From: Colin Walters <walters@verbum.org>
Date: Wed, 18 Sep 2024 13:41:59 -0400
Subject: [PATCH] curl: Make socket callback during cleanup into no-op
Because curl_multi_cleanup may invoke callbacks, we effectively have
some circular references going on here. See discussion in
https://github.com/curl/curl/issues/14860
Basically what we do is the socket callback libcurl may invoke into a no-op when
we detect we're finalizing. The data structures are owned by this object and
not by the callbacks, and will be destroyed below. Note that
e.g. g_hash_table_unref() may itself invoke callbacks, which is where
some data is cleaned up.
Signed-off-by: Colin Walters <walters@verbum.org>
--- a/src/libostree/ostree-fetcher-curl.c
+++ b/src/libostree/ostree-fetcher-curl.c
@@ -78,6 +78,7 @@ struct OstreeFetcher
struct curl_slist *extra_headers;
int tmpdir_dfd;
bool force_anonymous;
+ bool finalizing; // Set if we're in the process of teardown
char *custom_user_agent;
guint32 opt_low_speed_limit;
guint32 opt_low_speed_time;
@@ -180,6 +181,15 @@ _ostree_fetcher_finalize (GObject *object)
{
OstreeFetcher *self = OSTREE_FETCHER (object);
+ // Because curl_multi_cleanup may invoke callbacks, we effectively have
+ // some circular references going on here. See discussion in
+ // https://github.com/curl/curl/issues/14860
+ // Basically what we do is make most callbacks libcurl may invoke into no-ops when
+ // we detect we're finalizing. The data structures are owned by this object and
+ // not by the callbacks, and will be destroyed below. Note that
+ // e.g. g_hash_table_unref() may itself invoke callbacks, which is where
+ // some data is cleaned up.
+ self->finalizing = true;
curl_multi_cleanup (self->multi);
g_free (self->remote_name);
g_free (self->tls_ca_db_path);
@@ -528,6 +538,10 @@ sock_cb (CURL *easy, curl_socket_t s, int what, void *cbp, void *sockp)
OstreeFetcher *fetcher = cbp;
SockInfo *fdp = (SockInfo *)sockp;
+ // We do nothing if we're in the process of teardown; see below.
+ if (fetcher->finalizing)
+ return 0;
+
if (what == CURL_POLL_REMOVE)
{
if (!g_hash_table_remove (fetcher->sockets, fdp))

View File

@@ -0,0 +1,122 @@
# Copyright 1999-2024 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
inherit autotools systemd tmpfiles
DESCRIPTION="Operating system and container binary deployment and upgrades"
HOMEPAGE="https://ostreedev.github.io/ostree/"
SRC_URI="
https://github.com/ostreedev/ostree/releases/download/v${PV}/lib${P}.tar.xz
-> ${P}.tar.xz
"
S="${WORKDIR}/lib${P}"
LICENSE="LGPL-2+"
SLOT="0"
KEYWORDS="amd64 ~arm arm64 ~loong ~ppc64 ~riscv x86"
IUSE="archive +curl doc dracut gnutls +gpg grub +http2 httpd introspection libmount selinux sodium ssl +soup systemd zeroconf"
RESTRICT="test"
REQUIRED_USE="
dracut? ( systemd )
http2? ( curl )
httpd? ( || ( curl soup ) )
"
RDEPEND="
app-arch/xz-utils
dev-libs/glib:2
sys-fs/fuse:3
sys-libs/zlib
archive? ( app-arch/libarchive:= )
curl? ( net-misc/curl )
dracut? ( sys-kernel/dracut )
gpg? (
app-crypt/gpgme:=
dev-libs/libgpg-error
)
grub? ( sys-boot/grub:2= )
introspection? ( dev-libs/gobject-introspection )
libmount? ( sys-apps/util-linux )
selinux? ( sys-libs/libselinux )
sodium? ( >=dev-libs/libsodium-1.0.14:= )
soup? ( net-libs/libsoup:3.0 )
ssl? (
gnutls? ( net-libs/gnutls:= )
!gnutls? (
dev-libs/openssl:0=
)
)
systemd? ( sys-apps/systemd:0= )
zeroconf? ( net-dns/avahi[dbus] )
"
DEPEND="${RDEPEND}
app-text/docbook-xml-dtd:4.2
app-text/docbook-xsl-stylesheets
doc? (
dev-util/gtk-doc
app-text/docbook-xml-dtd:4.3
)
"
BDEPEND="
dev-libs/libxslt
dev-util/glib-utils
sys-devel/flex
sys-devel/bison
virtual/pkgconfig
"
PATCHES=(
"${FILESDIR}"/ostree-2023.3-dont-force-clang-introspection.patch
"${FILESDIR}"/${P}-curl.patch
)
src_prepare() {
default
eautoreconf
}
src_configure() {
# Needs Bison (bug #884289)
unset YACC
local econfargs=(
--enable-man
--enable-shared
--with-grub2-mkconfig-path=grub-mkconfig
--with-modern-grub
$(use_with archive libarchive)
$(use_with curl)
$(use_with dracut dracut yesbutnoconf) #816867
$(use_enable doc gtk-doc)
$(usex introspection --enable-introspection={,} yes no)
$(use_with gpg gpgme)
$(use_enable http2)
$(use_enable httpd trivial-httpd-cmdline)
$(use_with selinux )
$(use_with soup soup3)
--without-soup # libsoup:2.4
$(use_with libmount)
$(use ssl && { use gnutls && echo --with-crypto=gnutls || echo --with-crypto=openssl; })
$(use_with sodium ed25519-libsodium)
$(use_with systemd libsystemd)
$(use_with zeroconf avahi)
)
if use systemd; then
econfargs+=( --with-systemdsystemunitdir="$(systemd_get_systemunitdir)" )
fi
unset ${!XDG_*} #657346 g-ir-scanner sandbox violation
econf "${econfargs[@]}"
}
src_install() {
default
find "${D}" -name '*.la' -delete || die
}
pkg_postinst() {
tmpfiles_process ostree-tmpfiles.conf
}