]> git.ipfire.org Git - pakfire.git/commitdiff
packagelist: Break creating list from queue
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 2 Jul 2021 15:37:17 +0000 (15:37 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 2 Jul 2021 15:37:17 +0000 (15:37 +0000)
If an invalid package is being returned, we end importing the list and
cleanup.

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/libpakfire/packagelist.c

index e6bf25dd8ea570be5966b4cc9f31996844488e07..4cec1d0270fb9bd8a9b208931abfbf553002b8e3 100644 (file)
@@ -43,6 +43,17 @@ struct pakfire_packagelist {
        size_t count;
 };
 
+static void pakfire_packagelist_free(struct pakfire_packagelist* list) {
+       if (list->elements) {
+               for (unsigned int i = 0; i < list->count; i++)
+                       pakfire_package_unref(list->elements[i]);
+               free(list->elements);
+       }
+
+       pakfire_unref(list->pakfire);
+       free(list);
+}
+
 PAKFIRE_EXPORT int pakfire_packagelist_create(
                struct pakfire_packagelist** list, Pakfire pakfire) {
        struct pakfire_packagelist* l = calloc(1, sizeof(*l));
@@ -64,11 +75,20 @@ int pakfire_packagelist_create_from_queue(struct pakfire_packagelist** list, Pak
 
        for (int i = 0; i < q->count; i++) {
                struct pakfire_package* pkg = pakfire_package_create_from_solvable(pakfire, q->elements[i]);
+               if (!pkg)
+                       goto ERROR;
+
                pakfire_packagelist_push(*list, pkg);
                pakfire_package_unref(pkg);
        }
 
        return 0;
+
+ERROR:
+       pakfire_packagelist_free(*list);
+       *list = NULL;
+
+       return 1;
 }
 
 PAKFIRE_EXPORT struct pakfire_packagelist* pakfire_packagelist_ref(struct pakfire_packagelist* list) {
@@ -77,17 +97,6 @@ PAKFIRE_EXPORT struct pakfire_packagelist* pakfire_packagelist_ref(struct pakfir
        return list;
 }
 
-static void pakfire_packagelist_free(struct pakfire_packagelist* list) {
-       if (list->elements) {
-               for (unsigned int i = 0; i < list->count; i++)
-                       pakfire_package_unref(list->elements[i]);
-               free(list->elements);
-       }
-
-       pakfire_unref(list->pakfire);
-       free(list);
-}
-
 PAKFIRE_EXPORT struct pakfire_packagelist* pakfire_packagelist_unref(struct pakfire_packagelist* list) {
        if (--list->nrefs > 0)
                return list;