diff --git a/SOURCES/0001-queue_init_clone-const_cast.patch b/SOURCES/0001-queue_init_clone-const_cast.patch new file mode 100644 index 0000000..92de8ec --- /dev/null +++ b/SOURCES/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/SOURCES/0002-Fix-leaking-log-handlers-in-Sack-RhBug-1758737.patch b/SOURCES/0002-Fix-leaking-log-handlers-in-Sack-RhBug-1758737.patch new file mode 100644 index 0000000..6449819 --- /dev/null +++ b/SOURCES/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/SOURCES/queue_init_clone-const_cast.patch b/SOURCES/queue_init_clone-const_cast.patch deleted file mode 100644 index 92de8ec..0000000 --- a/SOURCES/queue_init_clone-const_cast.patch +++ /dev/null @@ -1,49 +0,0 @@ -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/SPECS/libdnf.spec b/SPECS/libdnf.spec index 497d542..902f5c0 100644 --- a/SPECS/libdnf.spec +++ b/SPECS/libdnf.spec @@ -31,12 +31,13 @@ Name: libdnf Version: 0.22.5 -Release: 1%{?dist} +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: queue_init_clone-const_cast.patch +Patch0: 0001-queue_init_clone-const_cast.patch +Patch1: 0002-Fix-leaking-log-handlers-in-Sack-RhBug-1758737.patch BuildRequires: cmake BuildRequires: gcc @@ -246,21 +247,95 @@ popd %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 -* Wed Jun 13 2018 Marek Blaha - 0.11.1-1 -- Update to 0.11.1 +* 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 -* Fri May 18 2018 Daniel Mach - 0.7.4-4 -- Rebuild on additional architectures +* Mon Feb 20 2017 Igor Gnatenko - 0.7.4-1 +- Update to 0.7.4 -* Thu Mar 23 2017 Igor Gnatenko - 0.7.4-3 -- Backport patch to find releasever in RPMDB +* Fri Feb 10 2017 Igor Gnatenko - 0.7.3-1 +- Update to 0.7.3 -* Mon Feb 20 2017 Jan Silhan - 0.7.4-2 -- 0.7.4 +* 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