diff --git a/.gitignore b/.gitignore index 6e2e23b..920eefa 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/librepo-1.9.2.tar.gz +SOURCES/librepo-1.10.3.tar.gz diff --git a/.librepo.metadata b/.librepo.metadata index 8dad383..62ec408 100644 --- a/.librepo.metadata +++ b/.librepo.metadata @@ -1 +1 @@ -3ee0b3178e273d7b0dcb1ff42b70405459c1f369 SOURCES/librepo-1.9.2.tar.gz +0f55637ac71b2f72f9ecd243ee3c220f6402f4af SOURCES/librepo-1.10.3.tar.gz diff --git a/SOURCES/0001-Handle-webservers-that-dont-support-ranges-when-downloading-zck.patch b/SOURCES/0001-Handle-webservers-that-dont-support-ranges-when-downloading-zck.patch new file mode 100644 index 0000000..f528c6b --- /dev/null +++ b/SOURCES/0001-Handle-webservers-that-dont-support-ranges-when-downloading-zck.patch @@ -0,0 +1,124 @@ +From 614d7874bfa82cb19b328278590af0f99e1ec682 Mon Sep 17 00:00:00 2001 +From: Jonathan Dieter +Date: Fri, 14 Jun 2019 23:13:30 +0100 +Subject: [PATCH] Handle webservers that don't support ranges when downloading zck + +Make sure we fall back to downloading full zchunk file if a webserver +doesn't support ranges. + +Signed-off-by: Jonathan Dieter +--- + librepo/downloader.c | 37 ++++++++++++++++++++++++++----------- + librepo/downloadtarget.c | 1 + + librepo/downloadtarget.h | 4 ++++ + 3 files changed, 31 insertions(+), 11 deletions(-) + +diff --git a/librepo/downloader.c b/librepo/downloader.c +index 6189681..53161f7 100644 +--- a/librepo/downloader.c ++++ b/librepo/downloader.c +@@ -473,7 +473,7 @@ lr_headercb(void *ptr, size_t size, size_t nmemb, void *userdata) + } + + #ifdef WITH_ZCHUNK +- if(lrtarget->target->is_zchunk) ++ if(lrtarget->target->is_zchunk && lrtarget->mirror->max_ranges > 0) + return lr_zckheadercb(ptr, size, nmemb, userdata); + #endif /* WITH_ZCHUNK */ + +@@ -586,7 +586,7 @@ lr_writecb(char *ptr, size_t size, size_t nmemb, void *userdata) + size_t cur_written; + LrTarget *target = (LrTarget *) userdata; + #ifdef WITH_ZCHUNK +- if(target->target->is_zchunk) ++ if(target->target->is_zchunk && target->mirror->max_ranges > 0) + return lr_zck_writecb(ptr, size, nmemb, userdata); + #endif /* WITH_ZCHUNK */ + +@@ -1240,6 +1240,12 @@ check_zck(LrTarget *target, GError **err) + assert(!err || *err == NULL); + assert(target && target->f && target->target); + ++ if(target->mirror->max_ranges == 0) { ++ target->zck_state = LR_ZCK_DL_BODY; ++ target->target->expectedsize = target->target->origsize; ++ return TRUE; ++ } ++ + if(target->target->zck_dl == NULL) { + target->target->zck_dl = zck_dl_init(NULL); + if(target->target->zck_dl == NULL) { +@@ -2166,25 +2172,34 @@ check_transfer_statuses(LrDownload *dd, GError **err) + if (target->target->is_zchunk) { + zckCtx *zck = NULL; + if (target->zck_state == LR_ZCK_DL_HEADER) { +- if(!lr_zck_valid_header(target->target, target->target->path, ++ if(target->mirror->max_ranges > 0 && ++ !lr_zck_valid_header(target->target, target->target->path, + fd, &transfer_err)) + goto transfer_error; + } else if(target->zck_state == LR_ZCK_DL_BODY) { +- zckCtx *zck = zck_dl_get_zck(target->target->zck_dl); +- if(zck == NULL) { +- g_set_error(&transfer_err, LR_DOWNLOADER_ERROR, LRE_ZCK, +- "Unable to get zchunk file from download context"); +- goto transfer_error; ++ if(target->mirror->max_ranges > 0) { ++ zckCtx *zck = zck_dl_get_zck(target->target->zck_dl); ++ if(zck == NULL) { ++ g_set_error(&transfer_err, LR_DOWNLOADER_ERROR, LRE_ZCK, ++ "Unable to get zchunk file from download context"); ++ goto transfer_error; ++ } ++ if(zck_failed_chunks(zck) == 0 && zck_missing_chunks(zck) == 0) ++ target->zck_state = LR_ZCK_DL_FINISHED; ++ } else { ++ if(target->range_fail) { ++ target->range_fail = FALSE; ++ } else { ++ target->zck_state = LR_ZCK_DL_FINISHED; ++ } + } +- if(zck_failed_chunks(zck) == 0 && zck_missing_chunks(zck) == 0) +- target->zck_state = LR_ZCK_DL_FINISHED; + } + if(target->zck_state == LR_ZCK_DL_FINISHED) { + zck = lr_zck_init_read(target->target, target->target->path, fd, + &transfer_err); + if(!zck) + goto transfer_error; +- if(!zck_validate_checksums(zck)) { ++ if(zck_validate_checksums(zck) < 1) { + zck_free(&zck); + g_set_error(&transfer_err, LR_DOWNLOADER_ERROR, LRE_BADCHECKSUM, + "At least one of the zchunk checksums doesn't match in %s", +diff --git a/librepo/downloadtarget.c b/librepo/downloadtarget.c +index d20aa44..40c10f3 100644 +--- a/librepo/downloadtarget.c ++++ b/librepo/downloadtarget.c +@@ -100,6 +100,7 @@ lr_downloadtarget_new(LrHandle *handle, + target->fn = lr_string_chunk_insert(target->chunk, fn); + target->checksums = possiblechecksums; + target->expectedsize = expectedsize; ++ target->origsize = expectedsize; + target->resume = resume; + target->progresscb = progresscb; + target->cbdata = cbdata; +diff --git a/librepo/downloadtarget.h b/librepo/downloadtarget.h +index f4c1f26..c935219 100644 +--- a/librepo/downloadtarget.h ++++ b/librepo/downloadtarget.h +@@ -88,6 +88,10 @@ typedef struct { + gint64 expectedsize; /*!< + Expected size of the target */ + ++ gint64 origsize; /*!< ++ Original expected size of the target. Sometimes expectedsize will ++ change, especially if zchunk is in use, but this will never change */ ++ + gboolean resume; /*!< + Resume: + 0 - no resume, download whole file, +-- +libgit2 0.28.2 + diff --git a/SOURCES/0002-Define-LRO_SUPPORTS_CACHEDIR-only-with-zchunk-RhBug17261411719830.patch b/SOURCES/0002-Define-LRO_SUPPORTS_CACHEDIR-only-with-zchunk-RhBug17261411719830.patch new file mode 100644 index 0000000..97b933d --- /dev/null +++ b/SOURCES/0002-Define-LRO_SUPPORTS_CACHEDIR-only-with-zchunk-RhBug17261411719830.patch @@ -0,0 +1,28 @@ +From ab99b7c51f18eb5e11b4350024f05f9c5b3795e6 Mon Sep 17 00:00:00 2001 +From: Jaroslav Mracek +Date: Tue, 2 Jul 2019 18:32:38 +0200 +Subject: [PATCH] Define LRO_SUPPORTS_CACHEDIR only with zchunk (RhBug:1726141,1719830) + +--- + librepo/handle.h | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/librepo/handle.h b/librepo/handle.h +index 48fdac6..96ac027 100644 +--- a/librepo/handle.h ++++ b/librepo/handle.h +@@ -37,9 +37,11 @@ G_BEGIN_DECLS + */ + typedef struct _LrHandle LrHandle; + ++#ifdef WITH_ZCHUNK + /** Define LRO_SUPPORTS_CACHEDIR so clients can check for this feature at build + * time */ + #define LRO_SUPPORTS_CACHEDIR ++#endif /* WITH_ZCHUNK */ + + /** LRO_FASTESTMIRRORMAXAGE default value */ + #define LRO_FASTESTMIRRORMAXAGE_DEFAULT 2592000L // 30 days +-- +libgit2 0.27.8 + diff --git a/SOURCES/0003-Fix-Verification-of-checksum-from-file-attr.patch b/SOURCES/0003-Fix-Verification-of-checksum-from-file-attr.patch new file mode 100644 index 0000000..fb9fefa --- /dev/null +++ b/SOURCES/0003-Fix-Verification-of-checksum-from-file-attr.patch @@ -0,0 +1,45 @@ +From 54e905450e53ed9b21a4737a41a4550958570067 Mon Sep 17 00:00:00 2001 +From: Jaroslav Rohel +Date: Thu, 5 Sep 2019 13:36:41 +0200 +Subject: [PATCH] Fix: Verification of checksum from file attr + +Related to https://bugzilla.redhat.com/show_bug.cgi?id=1700341 + +File copy could result in change in file attributes where +null-terminators are stripped out. The new code does not relly on it. +--- + librepo/checksum.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +diff --git a/librepo/checksum.c b/librepo/checksum.c +index 006a7fc..5d164eb 100644 +--- a/librepo/checksum.c ++++ b/librepo/checksum.c +@@ -221,18 +221,20 @@ lr_checksum_fd_compare(LrChecksumType type, + // Load cached checksum if enabled and used + struct stat st; + if (fstat(fd, &st) == 0) { +- ssize_t attr_ret; + _cleanup_free_ gchar *key = NULL; + char buf[256]; + + key = g_strdup_printf("user.Zif.MdChecksum[%llu]", + (unsigned long long) st.st_mtime); +- attr_ret = fgetxattr(fd, key, &buf, 256); +- if (attr_ret != -1) { ++ ssize_t attr_size = fgetxattr(fd, key, &buf, sizeof(buf)); ++ if (attr_size != -1) { + // Cached checksum found + g_debug("%s: Using checksum cached in xattr: [%s] %s", + __func__, key, buf); +- *matches = strcmp(expected, buf) ? FALSE : TRUE; ++ size_t expected_len = strlen(expected); ++ // xattr may contain null terminator (+1 byte) ++ *matches = (attr_size == expected_len || attr_size == expected_len + 1) && ++ memcmp(expected, buf, attr_size) == 0; + return TRUE; + } + } +-- +2.21.0 + diff --git a/SPECS/librepo.spec b/SPECS/librepo.spec index df6d110..c8a789d 100644 --- a/SPECS/librepo.spec +++ b/SPECS/librepo.spec @@ -1,31 +1,41 @@ +%global libcurl_version 7.28.0 + %if 0%{?rhel} && 0%{?rhel} <= 7 # Do not build bindings for python3 for RHEL <= 7 %bcond_with python3 # python-flask is not in RHEL7 -%bcond_with tests +%bcond_with pythontests %else %bcond_without python3 -%bcond_without tests +%bcond_without pythontests %endif -%if 0%{?rhel} && 0%{?rhel} > 7 -# Do not build bindings for python2 for RHEL > 7 +%if 0%{?rhel} > 7 || 0%{?fedora} > 29 +# Do not build bindings for python2 for RHEL > 7 and Fedora > 29 %bcond_with python2 %else %bcond_without python2 %endif +%if 0%{?rhel} +%bcond_with zchunk +%else +%bcond_without zchunk +%endif %global dnf_conflict 2.8.8 Name: librepo -Version: 1.9.2 -Release: 1%{?dist} +Version: 1.10.3 +Release: 3%{?dist} Summary: Repodata downloading library License: LGPLv2+ URL: https://github.com/rpm-software-management/librepo Source0: %{url}/archive/%{version}/%{name}-%{version}.tar.gz +Patch0: 0001-Handle-webservers-that-dont-support-ranges-when-downloading-zck.patch +Patch1: 0002-Define-LRO_SUPPORTS_CACHEDIR-only-with-zchunk-RhBug17261411719830.patch +Patch2: 0003-Fix-Verification-of-checksum-from-file-attr.patch BuildRequires: cmake BuildRequires: gcc @@ -34,10 +44,14 @@ BuildRequires: doxygen BuildRequires: pkgconfig(glib-2.0) BuildRequires: gpgme-devel BuildRequires: libattr-devel -BuildRequires: libcurl-devel >= 7.19.0 +BuildRequires: libcurl-devel >= %{libcurl_version} BuildRequires: pkgconfig(libxml-2.0) BuildRequires: pkgconfig(libcrypto) BuildRequires: pkgconfig(openssl) +%if %{with zchunk} +BuildRequires: pkgconfig(zck) >= 0.9.11 +%endif +Requires: libcurl%{?_isa} >= %{libcurl_version} %description A library providing C and Python (libcURL like) API to downloading repository @@ -56,21 +70,22 @@ Summary: Python bindings for the librepo library %{?python_provide:%python_provide python2-%{name}} %if 0%{?rhel} && 0%{?rhel} <= 7 BuildRequires: python-sphinx -BuildRequires: pygpgme %else BuildRequires: python2-sphinx -BuildRequires: python2-gpg %endif BuildRequires: python2-devel -%if (0%{?rhel} && 0%{?rhel} <= 7) || (0%{?fedora} && 0%{?fedora} <= 27) +%if %{with pythontests} +BuildRequires: python2-flask +BuildRequires: python2-nose +BuildRequires: python2-requests +%if (0%{?rhel} && 0%{?rhel} <= 7) BuildRequires: pyxattr +BuildRequires: pygpgme %else BuildRequires: python2-pyxattr +BuildRequires: python2-gpg %endif -%if %{with tests} -BuildRequires: python2-flask -BuildRequires: python2-nose -%endif +%endif # with pythontests Requires: %{name}%{?_isa} = %{version}-%{release} Conflicts: python2-dnf < %{dnf_conflict} @@ -82,14 +97,15 @@ Python 2 bindings for the librepo library. %package -n python3-%{name} Summary: Python 3 bindings for the librepo library %{?python_provide:%python_provide python3-%{name}} -BuildRequires: python3-gpg BuildRequires: python3-devel -%if %{with tests} +%if %{with pythontests} +BuildRequires: python3-gpg BuildRequires: python3-flask BuildRequires: python3-nose +BuildRequires: python3-pyxattr +BuildRequires: python3-requests %endif BuildRequires: python3-sphinx -BuildRequires: python3-pyxattr Requires: %{name}%{?_isa} = %{version}-%{release} # Obsoletes Fedora 27 package Obsoletes: platform-python-%{name} < %{version}-%{release} @@ -108,19 +124,18 @@ mkdir build-py3 %build %if %{with python2} pushd build-py2 - %cmake -DPYTHON_DESIRED:FILEPATH=%{__python2} .. + %cmake -DPYTHON_DESIRED:FILEPATH=%{__python2} %{!?with_zchunk:-DWITH_ZCHUNK=OFF} -DENABLE_PYTHON_TESTS=%{?with_pythontests:ON}%{!?with_pythontests:OFF} .. %make_build popd %endif %if %{with python3} pushd build-py3 - %cmake -DPYTHON_DESIRED:FILEPATH=%{__python3} .. + %cmake -DPYTHON_DESIRED:FILEPATH=%{__python3} %{!?with_zchunk:-DWITH_ZCHUNK=OFF} -DENABLE_PYTHON_TESTS=%{?with_pythontests:ON}%{!?with_pythontests:OFF} .. %make_build popd %endif -%if %{with tests} %check %if %{with python2} pushd build-py2 @@ -135,7 +150,6 @@ pushd build-py3 make ARGS="-V" test popd %endif -%endif %install %if %{with python2} @@ -178,6 +192,23 @@ popd %endif %changelog +* Fri Sep 06 2019 Marek Blaha - 1.10.3-3 +- Backport patch: Fix: Verification of checksum from file attr + +* Wed Jul 31 2019 Pavla Kratochvilova - 1.10.3-2 +- Backport patch: Define LRO_SUPPORTS_CACHEDIR only with zchunk (RhBug:1726141,1719830) + +* Tue Jun 11 2019 Pavla Kratochvilova - 1.10.3-1 +- Update to 1.10.3 +- Exit gpg-agent after repokey import (RhBug:1650266) + +* Mon May 13 2019 Pavla Kratochvilova - 1.10.1-1 +- Update to 1.10.1 +- Reduce download delays +- Add an option to preserve timestamps of the downloaded files (RhBug:1688537) +- Append the '?' part of repo URL after the path +- Fix memory leaks + * Tue Sep 25 2018 Jaroslav Mracek - 1.9.2-1 - Update to 1.9.2 - Bug 1626495 - major performance regression with libcurl-7.61.1