]> git.ipfire.org Git - people/ms/pakfire.git/commitdiff
httpclient: Don't store finished transfers internally
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 14 Jan 2024 16:12:56 +0000 (16:12 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 14 Jan 2024 16:12:56 +0000 (16:12 +0000)
This caused a recursion in reference counting resulting in the HTTP
client and all finished transfers never being freed.

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

index fdc50016b7dbc388783dbe61dcc5238941706c6c..69d795361dcdb7f356bddc540e986277861433fc 100644 (file)
@@ -53,7 +53,6 @@ struct pakfire_httpclient {
        // Transfers
        TAILQ_HEAD(xfers_queued, pakfire_xfer_element) xfers_queued;
        TAILQ_HEAD(xfers_running, pakfire_xfer_element) xfers_running;
-       TAILQ_HEAD(xfers_finished, pakfire_xfer_element) xfers_finished;
 };
 
 static int pakfire_httpclient_setup_curl(struct pakfire_httpclient* client) {
@@ -143,14 +142,6 @@ static void pakfire_httpclient_free(struct pakfire_httpclient* client) {
                pakfire_httpclient_xfer_free(x);
        }
 
-       // Free any finished transfers
-       while (!TAILQ_EMPTY(&client->xfers_finished)) {
-               x = TAILQ_LAST(&client->xfers_finished, xfers_finished);
-               TAILQ_REMOVE(&client->xfers_finished, x, nodes);
-
-               pakfire_httpclient_xfer_free(x);
-       }
-
        if (client->share)
                curl_share_cleanup(client->share);
        if (client->curl)
@@ -187,7 +178,6 @@ int pakfire_httpclient_create(struct pakfire_httpclient** client, struct pakfire
        // Init transfer queues
        TAILQ_INIT(&c->xfers_queued);
        TAILQ_INIT(&c->xfers_running);
-       TAILQ_INIT(&c->xfers_finished);
 
        // Setup cURL
        r = pakfire_httpclient_setup_curl(c);
@@ -306,7 +296,7 @@ static int pakfire_httpclient_start_transfers(struct pakfire_httpclient* client,
        return 0;
 
 ERROR:
-       TAILQ_INSERT_TAIL(&client->xfers_finished, x, nodes);
+       pakfire_httpclient_xfer_free(x);
 
        return r;
 }
@@ -408,7 +398,7 @@ int pakfire_httpclient_run(struct pakfire_httpclient* client, const char* title)
                                                // Otherwise this transfer has finished
                                                default:
                                                        if (x)
-                                                               TAILQ_INSERT_TAIL(&client->xfers_finished, x, nodes);
+                                                               pakfire_httpclient_xfer_free(x);
                                                        if (r)
                                                                goto ERROR;
                                                        break;