diff --git a/0001-queue_init_clone-const_cast.patch b/0001-queue_init_clone-const_cast.patch new file mode 100644 index 0000000000000000000000000000000000000000..92de8ecf85918a26ab235be38c729780c6980841 --- /dev/null +++ b/0001-queue_init_clone-const_cast.patch @@ -0,0 +1,49 @@ +diff -Naur a/libdnf/goal/IdQueue.hpp b/libdnf/goal/IdQueue.hpp +--- a/libdnf/goal/IdQueue.hpp 2019-01-04 14:12:04.000000000 +0100 ++++ b/libdnf/goal/IdQueue.hpp 2019-01-08 09:54:45.858216988 +0100 +@@ -51,13 +51,13 @@ + }; + + inline IdQueue::IdQueue() { queue_init(&queue); } +-inline IdQueue::IdQueue(const IdQueue & src) { queue_init_clone(&queue, &src.queue); } ++inline IdQueue::IdQueue(const IdQueue & src) { queue_init_clone(&queue, const_cast(&src.queue)); } + inline IdQueue::IdQueue(IdQueue && src) + { + queue_init(&queue); + std::swap(queue, src.queue); + } +-inline IdQueue::IdQueue(const Queue & src) { queue_init_clone(&queue, &src); } ++inline IdQueue::IdQueue(const Queue & src) { queue_init_clone(&queue, const_cast(&src)); } + + inline IdQueue::~IdQueue() { queue_free(&queue); } + +diff -Naur a/libdnf/repo/solvable/DependencyContainer.cpp b/libdnf/repo/solvable/DependencyContainer.cpp +--- a/libdnf/repo/solvable/DependencyContainer.cpp 2019-01-04 14:12:04.000000000 +0100 ++++ b/libdnf/repo/solvable/DependencyContainer.cpp 2019-01-08 09:54:19.623031878 +0100 +@@ -32,7 +32,7 @@ + DependencyContainer::DependencyContainer(const DependencyContainer &src) + : sack(src.sack) + { +- queue_init_clone(&this->queue, &queue); ++ queue_init_clone(&this->queue, const_cast(&queue)); + } + + +@@ -45,7 +45,7 @@ + DependencyContainer::DependencyContainer(DnfSack *sack, Queue queue) + : sack(sack) + { +- queue_init_clone(&this->queue, &queue); ++ queue_init_clone(&this->queue, const_cast(&queue)); + } + + DependencyContainer::~DependencyContainer() +@@ -56,7 +56,7 @@ + DependencyContainer &DependencyContainer::operator=(DependencyContainer &&src) noexcept + { + sack = src.sack; +- queue_init_clone(&queue, &src.queue); ++ queue_init_clone(&queue, const_cast(&src.queue)); + return *this; + } + diff --git a/0002-Fix-leaking-log-handlers-in-Sack-RhBug-1758737.patch b/0002-Fix-leaking-log-handlers-in-Sack-RhBug-1758737.patch new file mode 100644 index 0000000000000000000000000000000000000000..644981929aa6b505caa48ea935cfde19f37757d2 --- /dev/null +++ b/0002-Fix-leaking-log-handlers-in-Sack-RhBug-1758737.patch @@ -0,0 +1,115 @@ +From 0c39ba49a21b8861d9ffb4bee546bd9927cf0b3c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Hr=C3=A1zk=C3=BD?= +Date: Mon, 7 Oct 2019 16:33:48 +0200 +Subject: [PATCH] Fix leaking log handlers in Sack (RhBug:1758737) + +Stores the log handler ids in the sack and uses g_log_remove_handler() +in the sack destructor to remove the handlers. + +The mechanism is a bit complex and is explained in a code comment. + +https://bugzilla.redhat.com/show_bug.cgi?id=1758737 +--- + python/hawkey/sack-py.cpp | 47 +++++++++++++++++++++++++++++++++------ + python/hawkey/sack-py.hpp | 1 - + 2 files changed, 40 insertions(+), 8 deletions(-) + +diff --git a/python/hawkey/sack-py.cpp b/python/hawkey/sack-py.cpp +index e9253463..66479309 100644 +--- a/python/hawkey/sack-py.cpp ++++ b/python/hawkey/sack-py.cpp +@@ -47,6 +47,22 @@ typedef struct { + DnfSack *sack; + PyObject *custom_package_class; + PyObject *custom_package_val; ++ ++ // g_log handler IDs ++ // Multiple sacks can be created during a run of an application and each ++ // sack opens a log file and registers two g_log handlers. To avoid dangling ++ // handlers with invalid FILE pointers (we close them when destroying the ++ // sack), we need to keep track of the handlers so that we can also remove ++ // them. ++ // ++ // g_log is clever about adding log handlers. It does store all handlers ++ // registered for a given domain, but only the one that was registered last ++ // is used. If you remove the last registered one, the next in line will be ++ // used. That means stacking sacks is ok, the handler from the last ++ // undeleted sack will be the one that is used. ++ guint default_log_handler_id; ++ guint libdnf_log_handler_id; ++ + FILE *log_out; + } _SackObject; + +@@ -121,8 +137,13 @@ sack_dealloc(_SackObject *o) + Py_XDECREF(o->custom_package_val); + if (o->sack) + g_object_unref(o->sack); +- if (o->log_out) ++ ++ if (o->log_out) { ++ g_log_remove_handler(nullptr, o->default_log_handler_id); ++ g_log_remove_handler("libdnf", o->libdnf_log_handler_id); + fclose(o->log_out); ++ } ++ + Py_TYPE(o)->tp_free(o); + } + +@@ -177,15 +198,27 @@ log_handler(const gchar *log_domain, GLogLevelFlags log_level, const gchar *mess + g_free(msg); + } + +-gboolean +-set_logfile(const gchar *path, FILE *log_out) ++static void ++log_handler_noop(const gchar *, GLogLevelFlags, const gchar *, gpointer) + { +- log_out = fopen(path, "a"); ++} ++ ++static gboolean ++sack_set_logfile(_SackObject *self, const gchar *path) ++{ ++ self->log_out = fopen(path, "a"); + +- if (!log_out) ++ if (!self->log_out) + return FALSE; + +- g_log_set_default_handler(log_handler, log_out); ++ // The default log handler prints messages that weren't handled by any ++ // other logger to stderr/stdout, we do not want that ++ g_log_set_default_handler(log_handler_noop, nullptr); ++ ++ // set the handler for the default domain as well as "libdnf" ++ self->default_log_handler_id = g_log_set_handler(nullptr, G_LOG_LEVEL_MASK, log_handler, self->log_out); ++ self->libdnf_log_handler_id = g_log_set_handler("libdnf", G_LOG_LEVEL_MASK, log_handler, self->log_out); ++ + g_info("=== Started libdnf-%d.%d.%d ===", LIBDNF_MAJOR_VERSION, + LIBDNF_MINOR_VERSION, LIBDNF_MICRO_VERSION); + return TRUE; +@@ -237,7 +270,7 @@ sack_init(_SackObject *self, PyObject *args, PyObject *kwds) + PycompString logfile(logfile_py); + if (!logfile.getCString()) + return -1; +- if (!set_logfile(logfile.getCString(), self->log_out)) { ++ if (!sack_set_logfile(self, logfile.getCString())) { + PyErr_Format(PyExc_IOError, "Failed to open log file: %s", logfile.getCString()); + return -1; + } +diff --git a/python/hawkey/sack-py.hpp b/python/hawkey/sack-py.hpp +index cba8accb..4ae77380 100644 +--- a/python/hawkey/sack-py.hpp ++++ b/python/hawkey/sack-py.hpp +@@ -35,7 +35,6 @@ DnfSack *sackFromPyObject(PyObject *o); + int sack_converter(PyObject *o, DnfSack **sack_ptr); + + PyObject *new_package(PyObject *sack, Id id); +-gboolean set_logfile(const gchar *path, FILE *log_out); + const char *log_level_name(int level); + + #endif // SACK_PY_H +-- +2.25.2 + diff --git a/libdnf-0.22.5.tar.gz b/libdnf-0.22.5.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..922e1f16545e087d79add3a0295d3496f6fc1648 Binary files /dev/null and b/libdnf-0.22.5.tar.gz differ diff --git a/libdnf.spec b/libdnf.spec new file mode 100644 index 0000000000000000000000000000000000000000..902f5c0d75fd0c4b2337a09677a32ba77397c223 --- /dev/null +++ b/libdnf.spec @@ -0,0 +1,362 @@ +%global libsolv_version 0.6.34-1 +%global libmodulemd_version 1.6.1 +%global dnf_conflict 4.0.9.2 +%global swig_version 3.0.12 + +%bcond_with valgrind + +# Do not build bindings for python3 for RHEL <= 7 +%if 0%{?rhel} && 0%{?rhel} <= 7 +%bcond_with python3 +%else +%bcond_without python3 +%endif + +%if 0%{?rhel} > 7 || 0%{?fedora} > 29 +# Disable python2 build by default +%bcond_with python2 +%else +%bcond_without python2 +%endif + +%if 0%{?rhel} && ! 0%{?centos} +%bcond_without rhsm +%else +%bcond_with rhsm +%endif + +%global _cmake_opts \\\ + -DENABLE_RHSM_SUPPORT=%{?with_rhsm:ON}%{!?with_rhsm:OFF} \\\ + %{nil} + +Name: libdnf +Version: 0.22.5 +Release: 2%{?dist} +Summary: Library providing simplified C and Python API to libsolv +License: LGPLv2+ +URL: https://github.com/rpm-software-management/libdnf +Source0: %{url}/archive/%{version}/%{name}-%{version}.tar.gz +Patch0: 0001-queue_init_clone-const_cast.patch +Patch1: 0002-Fix-leaking-log-handlers-in-Sack-RhBug-1758737.patch + +BuildRequires: cmake +BuildRequires: gcc +BuildRequires: gcc-c++ +BuildRequires: libsolv-devel >= %{libsolv_version} +BuildRequires: pkgconfig(librepo) +BuildRequires: pkgconfig(check) +%if %{with valgrind} +BuildRequires: valgrind +%endif +BuildRequires: pkgconfig(gio-unix-2.0) >= 2.46.0 +BuildRequires: pkgconfig(gtk-doc) +BuildRequires: rpm-devel >= 4.11.0 +%if %{with rhsm} +BuildRequires: pkgconfig(librhsm) >= 0.0.3 +%endif +BuildRequires: pkgconfig(sqlite3) +BuildRequires: pkgconfig(json-c) +BuildRequires: pkgconfig(cppunit) +BuildRequires: pkgconfig(libcrypto) +BuildRequires: pkgconfig(modulemd) >= %{libmodulemd_version} +BuildRequires: pkgconfig(smartcols) +BuildRequires: gettext +BuildRequires: gpgme-devel + +Requires: libmodulemd%{?_isa} >= %{libmodulemd_version} +Requires: libsolv%{?_isa} >= %{libsolv_version} + +%description +A Library providing simplified C and Python API to libsolv. + +%package devel +Summary: Development files for %{name} +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: libsolv-devel%{?_isa} >= %{libsolv_version} + +%description devel +Development files for %{name}. + +%if %{with python2} +%package -n python2-%{name} +%{?python_provide:%python_provide python2-%{name}} +Summary: Python 2 bindings for the libdnf library. +Requires: %{name}%{?_isa} = %{version}-%{release} +BuildRequires: python2-devel +%if 0%{?rhel} == 7 +BuildRequires: python-sphinx +BuildRequires: swig3 >= %{swig_version} +%else +BuildRequires: python2-sphinx +BuildRequires: swig >= %{swig_version} +%endif + +%description -n python2-%{name} +Python 2 bindings for the libdnf library. +%endif # with python2 + +%if %{with python3} +%package -n python3-%{name} +%{?python_provide:%python_provide python3-%{name}} +Summary: Python 3 bindings for the libdnf library. +Requires: %{name}%{?_isa} = %{version}-%{release} +BuildRequires: python3-devel +BuildRequires: python3-sphinx +BuildRequires: swig >= %{swig_version} + +%description -n python3-%{name} +Python 3 bindings for the libdnf library. +%endif + +%if %{with python2} +%package -n python2-hawkey +Summary: Python 2 bindings for the hawkey library +%{?python_provide:%python_provide python2-hawkey} +BuildRequires: python2-devel +%if 0%{?rhel} && 0%{?rhel} <= 7 +BuildRequires: python-nose +%else +BuildRequires: python2-nose +%endif +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: python2-%{name} = %{version}-%{release} +# Fix problem with hawkey - dnf version incompatibility +# Can be deleted for distros where only python2-dnf >= 2.0.0 +Conflicts: python2-dnf < %{dnf_conflict} +Conflicts: python-dnf < %{dnf_conflict} + +%description -n python2-hawkey +Python 2 bindings for the hawkey library. +%endif # with python2 + +%if %{with python3} +%package -n python3-hawkey +Summary: Python 3 bindings for the hawkey library +%{?python_provide:%python_provide python3-hawkey} +BuildRequires: python3-devel +BuildRequires: python3-nose +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: python3-%{name} = %{version}-%{release} +# Fix problem with hawkey - dnf version incompatibility +# Can be deleted for distros where only python3-dnf >= 2.0.0 +Conflicts: python3-dnf < %{dnf_conflict} +# Obsoletes F27 packages +Obsoletes: platform-python-hawkey < %{version}-%{release} + +%description -n python3-hawkey +Python 3 bindings for the hawkey library. +%endif + +%prep +%autosetup -p1 +%if %{with python2} +mkdir build-py2 +%endif # with python2 +%if %{with python3} +mkdir build-py3 +%endif + +%build +%if %{with python2} +pushd build-py2 + %cmake -DPYTHON_DESIRED:FILEPATH=%{__python2} -DWITH_MAN=OFF ../ %{!?with_valgrind:-DDISABLE_VALGRIND=1} %{_cmake_opts} + %make_build +popd +%endif # with python2 + +%if %{with python3} +pushd build-py3 + %cmake -DPYTHON_DESIRED:FILEPATH=%{__python3} -DWITH_GIR=0 -DWITH_MAN=0 -Dgtkdoc=0 ../ %{!?with_valgrind:-DDISABLE_VALGRIND=1} %{_cmake_opts} + %make_build +popd +%endif + +%check +if [ "$(id -u)" == "0" ] ; then + cat <&2 +Package tests cannot be run under superuser account. +Please build the package as non-root user. +ERROR + exit 1 +fi + +%if %{with python2} +pushd build-py2 + make ARGS="-V" test +popd +%endif # with python2 +%if %{with python3} +# Run just the Python tests, not all of them, since +# we have coverage of the core from the first build +pushd build-py3/python/hawkey/tests + make ARGS="-V" test +popd +%endif + +%install +%if %{with python2} +pushd build-py2 + %make_install +popd +%endif # with python2 +%if %{with python3} +pushd build-py3 + %make_install +popd +%endif + +%find_lang %{name} + +%if 0%{?rhel} && 0%{?rhel} <= 7 +%post -p /sbin/ldconfig +%postun -p /sbin/ldconfig +%else +%ldconfig_scriptlets +%endif + +%files -f %{name}.lang +%license COPYING +%doc README.md AUTHORS +%{_libdir}/%{name}.so.* +%{_libdir}/libdnf/plugins/README + +%files devel +%doc %{_datadir}/gtk-doc/html/%{name}/ +%{_libdir}/%{name}.so +%{_libdir}/pkgconfig/%{name}.pc +%{_includedir}/%{name}/ + +%if %{with python2} +%files -n python2-%{name} +%{python2_sitearch}/%{name}/ +%endif # with python2 + +%if %{with python3} +%files -n python3-%{name} +%{python3_sitearch}/%{name}/ +%endif + +%if %{with python2} +%files -n python2-hawkey +%{python2_sitearch}/hawkey/ +%endif # with python2 + +%if %{with python3} +%files -n python3-hawkey +%{python3_sitearch}/hawkey/ +%endif + +%changelog +* Mon Apr 06 2020 Marek Blaha - 0.22.5-2 +- Backport patch for BZ#1781364 + +* Tue Jan 08 2019 Daniel Mach - 0.22.5-1 +- Update to 0.22.5 +- queue_init_clone src argument const_cast for libsolv 0.6.34 compatibility + +* Thu Nov 08 2018 Jaroslav Mracek - 0.11.1-4 +- Backport patch for RHBZ#1542307 from upstream libdnf-0.11.1 + +* Tue Nov 07 2017 Igor Gnatenko - 0.11.1-3 +- Use better Obsoletes for platform-python + +* Fri Nov 03 2017 Igor Gnatenko - 0.11.1-2 +- Remove platform-python subpackage + +* Mon Oct 16 2017 Jaroslav Mracek - 0.11.1-1 +- Rerelease of 0.11.1-1 +- Improvement query performance +- Run file query in hy_subject_get_best_solution only for files (arguments that start with ``/`` or + ``*/``) +- Resolves: rhbz#1498207 - DNF crash during upgrade installation F26 -> F27 + +* Tue Oct 10 2017 Igor Gnatenko - 0.11.0-1 +- Update to 0.11.0 + +* Mon Oct 02 2017 Jaroslav Mracek - 0.10.1-2 +- Rerelease of 0.10.1-1 + +* Wed Sep 27 2017 Jaroslav Mracek - 0.10.1-1 +- Update to 0.10.1 +- It improves query performance with name and arch filters. Also nevra filter will now + handle string with or without epoch. +- Additionally for python bindings it renames NEVRA._has_just_name() to NEVRA.has_just_name() due + to movement of code into c part of library. +- Resolves: rhbz#1260242 - --exclude does not affect dnf remove's removal of requirements +- Resolves: rhbz#1485881 - DNF claims it cannot install package, which have been already installed +- Resolves: rhbz#1361187 - [abrt] python-ipython-console: filter_updown(): python3.5 killed by SIGABRT + +* Fri Sep 15 2017 Igor Gnatenko - 0.9.3-8 +- Disable platform python on old releases + +* Tue Aug 15 2017 Lumír Balhar - 0.9.3-7 +- Add platform-python subpackage + +* Fri Aug 11 2017 Igor Gnatenko - 0.9.3-6 +- Rebuilt after RPM update (№ 3) + +* Thu Aug 10 2017 Igor Gnatenko - 0.9.3-5 +- Rebuilt for RPM soname bump + +* Thu Aug 10 2017 Igor Gnatenko - 0.9.3-4 +- Rebuilt for RPM soname bump + +* Thu Aug 03 2017 Fedora Release Engineering - 0.9.3-3 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild + +* Wed Jul 26 2017 Fedora Release Engineering - 0.9.3-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild + +* Mon Jul 24 2017 Jaroslav Mracek - 0.9.3-1 +- Update to 0.9.3 + +* Sat Jul 01 2017 Igor Gnatenko - 0.9.2-1 +- Update to 0.9.2 + +* Mon Jun 12 2017 Jaroslav Mracek - 0.9.1-1 +- Update to 0.9.1 + +* Mon May 22 2017 Jaroslav Mracek - 0.9.0-1 +- Update to 0.9.0 + +* Tue May 02 2017 Jaroslav Mracek - 0.8.2-1 +- Update to 0.8.2 + +* Fri Mar 24 2017 Igor Gnatenko - 0.8.1-1 +- Update to 0.8.1 + +* Tue Mar 21 2017 Jaroslav Mracek - 0.8.0-1 +- Update to 0.8.0 + +* Mon Feb 20 2017 Igor Gnatenko - 0.7.4-1 +- Update to 0.7.4 + +* Fri Feb 10 2017 Igor Gnatenko - 0.7.3-1 +- Update to 0.7.3 + +* Wed Feb 08 2017 Igor Gnatenko - 0.7.2-1 +- 0.7.2 + +* Fri Jan 06 2017 Igor Gnatenko - 0.7.1-1 +- 0.7.1 + +* Wed Dec 21 2016 Peter Robinson 0.7.0-0.7gitf9b798c +- Rebuild for Python 3.6 + +* Mon Dec 19 2016 Igor Gnatenko - 0.7.0-0.6gitf9b798c +- Use new upstream URL + +* Tue Dec 13 2016 Stratakis Charalampos - 0.7.0-0.5gitf9b798c +- Rebuild for Python 3.6 + +* Tue Dec 06 2016 Martin Hatina - 0.7.0-0.4gitf9b798c +- Increase conflict version of dnf + +* Thu Dec 01 2016 Igor Gnatenko - 0.7.0-0.3gitf9b798c +- Update to latest snapshot + +* Fri Nov 04 2016 Igor Gnatenko - 0.7.0-0.2git8bd77f8 +- Update to latest snapshot + +* Thu Sep 29 2016 Igor Gnatenko - 0.7.0-0.1git179c0a6 +- Initial package