]> git.ipfire.org Git - people/stevee/pakfire.git/commitdiff
libpakfire: Properly use refcounting when using packagelists
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 14 Jan 2018 18:23:52 +0000 (19:23 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 14 Jan 2018 18:23:52 +0000 (19:23 +0100)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/_pakfire/relation.c
src/_pakfire/selector.c
src/_pakfire/util.c
src/libpakfire/include/pakfire/packagelist.h
src/libpakfire/packagelist.c
src/libpakfire/transaction.c

index ef13639757e0e1398c34820fc26b492d1dc3ba68..7a648787327dc206722839dd5119b32a1dfd36c3 100644 (file)
@@ -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;
index 57c7dc1e4cd8ec1cb27fa67cf9b69afc40b8e824..f6634cb85a95fffeedf85404e5b798d3aeb881d7 100644 (file)
@@ -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;
index c62c070ed54d24b90739a9562f83c611e86dbc8f..c3447a41fedbe7d619e91fe2c0a816f9d6821e6b 100644 (file)
@@ -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);
        }
 
index 5a757815d52622477d498413b3d707c9a5026800..3d00fd11150cf0daf923e71461062d15500b0d66 100644 (file)
@@ -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 {
index 1b33ec6451cfd409a946d0b2085cfdcd990e4ffa..8bcddf8946592a333cc9b23b147c9e013d0b6230 100644 (file)
@@ -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;
 }
index 6af7d3204b53122980d2b595320ed46ce15ce517..bfbb8c53e0032f6c9fd58d6cfbfddae1179ee71f 100644 (file)
@@ -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