From 53b1db84ef622b60d101502b2b2e0c4574486ee6 Mon Sep 17 00:00:00 2001 From: Allan McRae Date: Fri, 9 May 2025 12:59:28 +1000 Subject: [PATCH] Fix memory leak in download payload The file stream associated with downloads without a filename is not being freed when downloading using the sandbox user. Signed-off-by: Allan McRae --- lib/libalpm/dload.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c index 6db187d7..acb8e16d 100644 --- a/lib/libalpm/dload.c +++ b/lib/libalpm/dload.c @@ -698,9 +698,9 @@ cleanup: * only applies to FTP transfers. */ curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L); curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, (char *)NULL); - if(payload->localf != NULL) { fclose(payload->localf); + payload->localf = NULL; utimes_long(payload->tempfile_name, remote_time); } @@ -880,7 +880,6 @@ static int curl_download_internal(alpm_handle_t *handle, p = NULL; err = -1; } - while(true) { int msgs_left = 0; CURLMsg *msg = curl_multi_info_read(curlm, &msgs_left); @@ -904,7 +903,6 @@ static int curl_download_internal(alpm_handle_t *handle, } } } - int ret = err ? -1 : updated ? 0 : 1; _alpm_log(handle, ALPM_LOG_DEBUG, "curl_download_internal return code is %d\n", ret); alpm_list_free(payloads); @@ -1365,7 +1363,6 @@ int SYMEXPORT alpm_fetch_pkgurl(alpm_handle_t *handle, const alpm_list_t *urls, _alpm_log(handle, ALPM_LOG_WARNING, _("failed to retrieve some files\n")); event.type = ALPM_EVENT_PKG_RETRIEVE_FAILED; EVENT(handle, &event); - GOTO_ERR(handle, ALPM_ERR_RETRIEVE, err); } else { event.type = ALPM_EVENT_PKG_RETRIEVE_DONE; @@ -1412,6 +1409,11 @@ void _alpm_dload_payload_reset(struct dload_payload *payload) { ASSERT(payload, return); + if(payload->localf != NULL) { + fclose(payload->localf); + payload->localf = NULL; + } + FREE(payload->remote_name); FREE(payload->tempfile_name); FREE(payload->destfile_name);