From: Michael Tremer Date: Sun, 14 Jan 2024 16:12:56 +0000 (+0000) Subject: httpclient: Don't store finished transfers internally X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=469f2dd81cd234dec59682af1c78cb9348619385;hp=f1b8098356071634b3e9968669025632f71fee16;p=pakfire.git httpclient: Don't store finished transfers internally This caused a recursion in reference counting resulting in the HTTP client and all finished transfers never being freed. Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/httpclient.c b/src/libpakfire/httpclient.c index fdc50016..69d79536 100644 --- a/src/libpakfire/httpclient.c +++ b/src/libpakfire/httpclient.c @@ -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;