From fef0d601b77047fc04611bede9d159ab26e07ce8 Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sun, 14 Jan 2018 19:23:52 +0100 Subject: [PATCH] libpakfire: Properly use refcounting when using packagelists Signed-off-by: Michael Tremer --- src/_pakfire/relation.c | 9 ++++++--- src/_pakfire/selector.c | 9 ++++++--- src/_pakfire/util.c | 2 ++ src/libpakfire/include/pakfire/packagelist.h | 3 --- src/libpakfire/packagelist.c | 2 +- src/libpakfire/transaction.c | 1 + 6 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/_pakfire/relation.c b/src/_pakfire/relation.c index ef1363975..7a6487873 100644 --- a/src/_pakfire/relation.c +++ b/src/_pakfire/relation.c @@ -112,13 +112,16 @@ static PyObject* Relation_get_providers(RelationObject* self) { PakfirePackageList packagelist = pakfire_relation_providers(self->relation); PyObject* list = PyList_New(0); - PakfirePackage package; - int i; + for (unsigned int i = 0; i < pakfire_packagelist_count(packagelist); i++) { + PakfirePackage package = pakfire_packagelist_get(packagelist, i); - FOR_PACKAGELIST(package, packagelist, i) { PyObject* obj = new_package(self->pool, pakfire_package_id(package)); PyList_Append(list, obj); + + pakfire_package_unref(package); + Py_DECREF(obj); } + pakfire_packagelist_free(packagelist); return list; diff --git a/src/_pakfire/selector.c b/src/_pakfire/selector.c index 57c7dc1e4..f6634cb85 100644 --- a/src/_pakfire/selector.c +++ b/src/_pakfire/selector.c @@ -86,13 +86,16 @@ static PyObject* Selector_get_providers(SelectorObject* self) { PakfirePackageList packagelist = pakfire_selector_providers(self->selector); PyObject* list = PyList_New(0); - PakfirePackage package; - int i; + for (unsigned int i = 0; i < pakfire_packagelist_count(packagelist); i++) { + PakfirePackage package = pakfire_packagelist_get(packagelist, i); - FOR_PACKAGELIST(package, packagelist, i) { PyObject* obj = new_package(self->pool, pakfire_package_id(package)); PyList_Append(list, obj); + + pakfire_package_unref(package); + Py_DECREF(obj); } + pakfire_packagelist_free(packagelist); return list; diff --git a/src/_pakfire/util.c b/src/_pakfire/util.c index c62c070ed..c3447a41f 100644 --- a/src/_pakfire/util.c +++ b/src/_pakfire/util.c @@ -151,6 +151,8 @@ PyObject* PyList_FromPackageList(PoolObject* pool, PakfirePackageList packagelis PyObject* item = new_package(pool, pakfire_package_id(package)); PyList_Append(list, item); + + pakfire_package_unref(package); Py_DECREF(item); } diff --git a/src/libpakfire/include/pakfire/packagelist.h b/src/libpakfire/include/pakfire/packagelist.h index 5a757815d..3d00fd111 100644 --- a/src/libpakfire/include/pakfire/packagelist.h +++ b/src/libpakfire/include/pakfire/packagelist.h @@ -36,9 +36,6 @@ PakfirePackage pakfire_packagelist_get(PakfirePackageList list, int index); void pakfire_packagelist_push(PakfirePackageList list, PakfirePackage pkg); void pakfire_packagelist_push_if_not_exists(PakfirePackageList list, PakfirePackage pkg); -#define FOR_PACKAGELIST(pkg, list, i) \ - for (i = 0; (pkg = pakfire_packagelist_get(list, i)) != NULL; i++) - #ifdef PAKFIRE_PRIVATE struct _PakfirePackageList { diff --git a/src/libpakfire/packagelist.c b/src/libpakfire/packagelist.c index 1b33ec645..8bcddf894 100644 --- a/src/libpakfire/packagelist.c +++ b/src/libpakfire/packagelist.c @@ -63,7 +63,7 @@ PAKFIRE_EXPORT void pakfire_packagelist_sort(PakfirePackageList list) { PAKFIRE_EXPORT PakfirePackage pakfire_packagelist_get(PakfirePackageList list, int index) { if (index < list->count) - return list->elements[index]; + return pakfire_package_ref(list->elements[index]); return NULL; } diff --git a/src/libpakfire/transaction.c b/src/libpakfire/transaction.c index 6af7d3204..bfbb8c53e 100644 --- a/src/libpakfire/transaction.c +++ b/src/libpakfire/transaction.c @@ -224,6 +224,7 @@ static size_t pakfire_transaction_add_section(char** str, size_t width, PakfireT for (unsigned int i = 0; i < c; i++) { PakfirePackage pkg = pakfire_packagelist_get(list, i); pakfire_transaction_add_package(str, width, pkg); + pakfire_package_unref(pkg); } // newline -- 2.39.5