diff options
author | Julian Andres Klode <jak@debian.org> | 2021-04-13 15:22:37 +0000 |
---|---|---|
committer | Julian Andres Klode <jak@debian.org> | 2021-04-13 15:22:37 +0000 |
commit | 734c6ce0d3250d0b35cf3d0dd54e8baae3774fa8 (patch) | |
tree | cea11605e9ddbe8e5763d8f2e822d9c764dbd363 | |
parent | 7a3b13832bf60d8d086c07ea96aa656ac9439f66 (diff) | |
parent | 1412cf51403286e9c040f9f86fd4d8306e62aff2 (diff) |
Merge branch 'pu/unsized-packages' into 'main'
Fix downloads of unsized files that are largest in pipeline
See merge request apt-team/apt!161
-rw-r--r-- | apt-pkg/acquire-item.cc | 7 | ||||
-rw-r--r-- | doc/examples/configure-index | 1 | ||||
-rw-r--r-- | methods/basehttp.cc | 4 | ||||
-rw-r--r-- | test/integration/framework | 4 | ||||
-rwxr-xr-x | test/integration/test-ubuntu-bug-1921626-unsized-packages | 43 |
5 files changed, 59 insertions, 0 deletions
diff --git a/apt-pkg/acquire-item.cc b/apt-pkg/acquire-item.cc index ab4306aac..2bab7d5c0 100644 --- a/apt-pkg/acquire-item.cc +++ b/apt-pkg/acquire-item.cc @@ -3469,6 +3469,13 @@ pkgAcqArchive::pkgAcqArchive(pkgAcquire *const Owner, pkgSourceList *const Sourc Version.VerStr(), Version.ParentPkg().FullName(false).c_str()); return; } + if (FileSize == 0 && not _config->FindB("Acquire::AllowUnsizedPackages", false)) + { + _error->Error("Repository is broken: %s (= %s) has no Size information", + Version.ParentPkg().FullName(false).c_str(), + Version.VerStr()); + return; + } // Check if we already downloaded the file struct stat Buf; diff --git a/doc/examples/configure-index b/doc/examples/configure-index index ecd54b6ba..593cde9a3 100644 --- a/doc/examples/configure-index +++ b/doc/examples/configure-index @@ -257,6 +257,7 @@ Acquire AllowInsecureRepositories "<BOOL>"; AllowWeakRepositories "<BOOL>"; AllowDowngradeToInsecureRepositories "<BOOL>"; + AllowUnsizedPackages "<BOOL>"; // defaults to true. // allow repositories to change information potentially breaking user config like pinning AllowReleaseInfoChange "<BOOL>" { diff --git a/methods/basehttp.cc b/methods/basehttp.cc index 3786e2e6c..f2c4156e1 100644 --- a/methods/basehttp.cc +++ b/methods/basehttp.cc @@ -882,7 +882,11 @@ unsigned long long BaseHttpMethod::FindMaximumObjectSizeInQueue() const /*{{{*/ { unsigned long long MaxSizeInQueue = 0; for (FetchItem *I = Queue; I != 0 && I != QueueBack; I = I->Next) + { + if (I->MaximumSize == 0) + return 0; MaxSizeInQueue = std::max(MaxSizeInQueue, I->MaximumSize); + } return MaxSizeInQueue; } /*}}}*/ diff --git a/test/integration/framework b/test/integration/framework index cfde80329..412a96577 100644 --- a/test/integration/framework +++ b/test/integration/framework @@ -486,6 +486,10 @@ EOF echo 'APT::Machine-ID "912e43bd1c1d4ba481f9f8ccab25f9ee";' > rootdir/etc/apt/apt.conf.d/machine-id + # XXX: We really ought to make the packages in the test suite all have Size fields. + # But this needs a lot more changes, so let's keep it simple for stable updates. + echo 'Acquire::AllowUnsizedPackages "true";' >> rootdir/etc/apt/apt.conf.d/temporary-allow-unsized-packages + configcompression '.' 'gz' #'bz2' 'lzma' 'xz' confighashes 'SHA256' # these are tests, not security best-practices diff --git a/test/integration/test-ubuntu-bug-1921626-unsized-packages b/test/integration/test-ubuntu-bug-1921626-unsized-packages new file mode 100755 index 000000000..361cccd2e --- /dev/null +++ b/test/integration/test-ubuntu-bug-1921626-unsized-packages @@ -0,0 +1,43 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture "i386" +confighashes 'SHA512' + +mkdir tree +head -c $((5*1024)) /dev/urandom > tree/data-file + +buildsimplenativepackage 'a' 'all' '1.0' 'stable' +buildsimplenativepackage 'b' 'all' '1.0' 'stable' '' '' '' '' "$PWD/tree" +buildsimplenativepackage 'c' 'all' '1.0' 'stable' + +setupaptarchive +changetowebserver + +# Disable sandbox +echo 'APT::Sandbox::User "root";' > rootdir/etc/apt/apt.conf.d/no-acquire-sandbox +# XXX: Remove temporary hack +rm rootdir/etc/apt/apt.conf.d/temporary-allow-unsized-packages + +testsuccess apt update + +for file in rootdir/var/lib/apt/lists/*Packages; do + awk '!(/^Size/ && ++cnt==2)' $file > $file.new + mv $file.new $file +done + + +size_a=$(wc -c aptarchive/pool/a_1.0_all.deb | awk '{print $1}') +size_b=$(wc -c aptarchive/pool/b_1.0_all.deb | awk '{print $1}') +size_c=$(wc -c aptarchive/pool/c_1.0_all.deb | awk '{print $1}') + +testsuccessequal "Get:1 http://localhost:${APTHTTPPORT} stable/main all a all 1.0 [$size_a B] +Get:2 http://localhost:${APTHTTPPORT} stable/main all b all 1.0 [$size_b B] +Get:3 http://localhost:${APTHTTPPORT} stable/main all c all 1.0 [$size_c B]" apt download a b c -o Acquire::AllowUnsizedPackages=true + +rm *.deb +testfailureequal "E: Repository is broken: b:i386 (= 1.0) has no Size information" apt download a b c |