diff --git a/backport-Add-missing-end-callback-for-already-downloaded-zchu.patch b/backport-Add-missing-end-callback-for-already-downloaded-zchu.patch new file mode 100644 index 0000000000000000000000000000000000000000..73e1cd109818f7ef5daaed5598a57c04df97f179 --- /dev/null +++ b/backport-Add-missing-end-callback-for-already-downloaded-zchu.patch @@ -0,0 +1,39 @@ +From e61ae8d15124d5d57452610f2422175a8013b2b9 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Thu, 3 Apr 2025 09:04:20 +0200 +Subject: [PATCH] Add missing end callback for already downloaded zchunk files + +When the target is set as finished we have to call its end callback if +there is one. + +The lr_download_metadata API relies on all end callback being called +which highlighted this bug. +--- + librepo/downloader.c | 11 +++++++++++ + 1 file changed, 11 insertions(+) + +diff --git a/librepo/downloader.c b/librepo/downloader.c +index 27ec2cb..770a1f1 100644 +--- a/librepo/downloader.c ++++ b/librepo/downloader.c +@@ -1535,6 +1535,17 @@ prepare_next_transfer(LrDownload *dd, gboolean *candidatefound, GError **err) + if(target->zck_state == LR_ZCK_DL_FINISHED) { + g_debug("%s: Target already fully downloaded: %s", __func__, target->target->path); + target->state = LR_DS_FINISHED; ++ LrEndCb end_cb = target->target->endcb; ++ if (end_cb) { ++ int rc = end_cb(target->target->cbdata, ++ LR_TRANSFER_SUCCESSFUL, ++ "Already downloaded"); ++ if (rc == LR_CB_ERROR) { ++ g_set_error(err, LR_DOWNLOADER_ERROR, LRE_CBINTERRUPTED, ++ "Interrupted by LR_CB_ERROR from end callback"); ++ goto fail; ++ } ++ } + curl_easy_cleanup(target->curl_handle); + target->curl_handle = NULL; + g_free(target->headercb_interrupt_reason); +-- +2.43.0 + diff --git a/backport-Fix-a-memory-leak-of-the-glib-slist-of-GSList-downlo.patch b/backport-Fix-a-memory-leak-of-the-glib-slist-of-GSList-downlo.patch new file mode 100644 index 0000000000000000000000000000000000000000..f4e89b385320fba54e1c3b36eeb7104e9ae54646 --- /dev/null +++ b/backport-Fix-a-memory-leak-of-the-glib-slist-of-GSList-downlo.patch @@ -0,0 +1,27 @@ +From a20f0f2642b9b2878493b51ad53fee1efb9ee6f7 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Tue, 18 Mar 2025 10:23:04 +0100 +Subject: [PATCH] Fix a memory leak of the glib slist of GSList + *download_targets + +The data is freed above in the same `lr_metadata_download_cleanup` +function. +--- + librepo/metadata_downloader.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/librepo/metadata_downloader.c b/librepo/metadata_downloader.c +index 2066c7b..0b6c4f4 100644 +--- a/librepo/metadata_downloader.c ++++ b/librepo/metadata_downloader.c +@@ -373,6 +373,7 @@ lr_metadata_download_cleanup(GSList *download_targets) + + lr_downloadtarget_free(download_target); + } ++ g_slist_free(download_targets); + + return ret; + } +-- +2.43.0 + diff --git a/backport-LrMetadataTarget-fix-memory-leak-of-repo-and-repomd.patch b/backport-LrMetadataTarget-fix-memory-leak-of-repo-and-repomd.patch new file mode 100644 index 0000000000000000000000000000000000000000..712601b69b03eb8339b7801a4f7ab6e434664ceb --- /dev/null +++ b/backport-LrMetadataTarget-fix-memory-leak-of-repo-and-repomd.patch @@ -0,0 +1,41 @@ +From f362c4ad0f3fc1a5b3a5662c7eb70a01ee5692d4 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Tue, 18 Mar 2025 10:11:19 +0100 +Subject: [PATCH] LrMetadataTarget: fix memory leak of repo and repomd + +--- + librepo/metadata_downloader.c | 2 ++ + librepo/metadata_downloader.h | 4 ++-- + 2 files changed, 4 insertions(+), 2 deletions(-) + +diff --git a/librepo/metadata_downloader.c b/librepo/metadata_downloader.c +index ee5f7f1..2066c7b 100644 +--- a/librepo/metadata_downloader.c ++++ b/librepo/metadata_downloader.c +@@ -92,6 +92,8 @@ lr_metadatatarget_free(LrMetadataTarget *target) + return; + g_string_chunk_free(target->chunk); + g_list_free_full(target->err, g_free); ++ lr_yum_repo_free(target->repo); ++ lr_yum_repomd_free(target->repomd); + g_free(target); + } + +diff --git a/librepo/metadata_downloader.h b/librepo/metadata_downloader.h +index 5d3b1d7..bd0ccf6 100644 +--- a/librepo/metadata_downloader.h ++++ b/librepo/metadata_downloader.h +@@ -75,8 +75,8 @@ typedef struct { + /** + * Create new LrMetadataTarget object. + * @param handle Handle related to this download or NULL. +- * @param repo Related repo. +- * @param repomd Related repomd. ++ * @param repo Related repo (transfers ownership to the LrMetadataTarget). ++ * @param repomd Related repomd (transfers ownership to the LrMetadataTarget). + * @param cbdata User data for the callback + * @param err GError ** + * @return Newly allocated LrMetadataTarget or NULL on error +-- +2.43.0 + diff --git a/backport-Since-gnupghomedir-is-optional-allow-None-and-check-.patch b/backport-Since-gnupghomedir-is-optional-allow-None-and-check-.patch new file mode 100644 index 0000000000000000000000000000000000000000..28b2eb2fe48fc0630a24aa8f052057c8424b1a77 --- /dev/null +++ b/backport-Since-gnupghomedir-is-optional-allow-None-and-check-.patch @@ -0,0 +1,46 @@ +From 6c046fca8d41c9ee395958e3304c85d2ce9337ac Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ale=C5=A1=20Mat=C4=9Bj?= +Date: Mon, 17 Mar 2025 14:20:25 +0100 +Subject: [PATCH] Since `gnupghomedir` is optional allow `None` and check + before using it + +This fixes a crash when the `gnupghomedir` is NULL or not specified on +Python API. + +Such as: https://github.com/rpm-software-management/librepo/blob/master/librepo/python/__init__.py#L1192-L1193 +--- + librepo/metadata_downloader.c | 4 +++- + librepo/python/metadatatarget-py.c | 2 +- + 2 files changed, 4 insertions(+), 2 deletions(-) + +diff --git a/librepo/metadata_downloader.c b/librepo/metadata_downloader.c +index 6604255..ee5f7f1 100644 +--- a/librepo/metadata_downloader.c ++++ b/librepo/metadata_downloader.c +@@ -78,7 +78,9 @@ lr_metadatatarget_new2(LrHandle *handle, + target->progresscb = progresscb; + target->mirrorfailurecb = mirrorfailure_cb; + target->endcb = endcb; +- target->gnupghomedir = g_string_chunk_insert(target->chunk, gnupghomedir); ++ if (gnupghomedir) { ++ target->gnupghomedir = g_string_chunk_insert(target->chunk, gnupghomedir); ++ } + + return target; + } +diff --git a/librepo/python/metadatatarget-py.c b/librepo/python/metadatatarget-py.c +index 7ddabe2..281e208 100644 +--- a/librepo/python/metadatatarget-py.c ++++ b/librepo/python/metadatatarget-py.c +@@ -262,7 +262,7 @@ metadatatarget_init(_MetadataTargetObject *self, + LrMirrorFailureCb mirrorfailurecb = NULL; + GError *tmp_err = NULL; + +- if (!PyArg_ParseTuple(args, "OOOOOs:metadatatarget_init", ++ if (!PyArg_ParseTuple(args, "OOOOOz:metadatatarget_init", + &pyhandle, &py_cbdata, &py_progresscb, + &py_mirrorfailurecb, &py_endcb, &gnupghomedir)) + return -1; +-- +2.43.0 + diff --git a/librepo.spec b/librepo.spec index 2b333cf10cf9691715445e3bd80a5e518727d829..cd515dbb238020e33d2da355efbe3a7cac50bfa3 100644 --- a/librepo.spec +++ b/librepo.spec @@ -6,7 +6,7 @@ Name: librepo Version: 1.14.2 -Release: 5 +Release: 6 Summary: Repodata downloading library License: LGPLv2+ URL: https://github.com/rpm-software-management/librepo @@ -17,6 +17,10 @@ Patch2: backport-More-covscan-fixes.patch Patch3: backport-Use-g_strdup_vprintf-instead-of-manually-calculating.patch Patch4: backport-Use-g_list_free_full-to-free-LRMetadataTarget-err.patch Patch5: backport-Fix-a-memory-leak-in-select_next_target.patch +Patch6: backport-Fix-a-memory-leak-of-the-glib-slist-of-GSList-downlo.patch +Patch7: backport-Add-missing-end-callback-for-already-downloaded-zchu.patch +Patch8: backport-LrMetadataTarget-fix-memory-leak-of-repo-and-repomd.patch +Patch9: backport-Since-gnupghomedir-is-optional-allow-None-and-check-.patch BuildRequires: cmake check-devel doxygen pkgconfig(glib-2.0) gcc BuildRequires: libcurl-devel >= %{libcurl_version} pkgconfig(libxml-2.0) @@ -84,6 +88,13 @@ popd %{python3_sitearch}/%{name}/ %changelog +* Tue Aug 26 2025 yixiangzhike - 1.14.2-6 +- backport patches from upstream + Fix a memory leak of the glib slist + Add missing end callback for already downloaded zchunk files + Fix memory leak of repo and repomd + Fix a crash when the gnupghomedir is NULL or not specified on Python API + * Mon Oct 21 2024 caixiaomeng - 1.14.2-5 - backport upstream commits, fix memory leak