--- Begin Message ---
Package: release.debian.org
User: release.debian.org@packages.debian.org
Usertags: pu
Tags: jessie
Severity: normal
Dear stable release managers,
I would like to ask for a p-u upload for apt. The following
bugs will be fixed with that upload:
* parse specific-arch dependencies correctly on single-arch systems
(Closes: 777760)
* remove "first package seen is native package" assumption.
Thanks to Axel Beckert for testing (Closes: 782777)
* Fix endless loop in apt-get update that can cause disk
fillup (LP: #1445239)
The code diff is attached. The fixes were also uploaded to sid some
days ago.
Thanks for your consideration,
David & Michael
-- System Information:
Debian Release: jessie/sid
APT prefers unstable
APT policy: (500, 'unstable')
Architecture: amd64 (x86_64)
diff -Nru apt-1.0.9.8/apt-pkg/pkgcache.cc apt-1.0.9.8.1/apt-pkg/pkgcache.cc
--- apt-1.0.9.8/apt-pkg/pkgcache.cc 2015-04-13 07:25:06.000000000 +0200
+++ apt-1.0.9.8.1/apt-pkg/pkgcache.cc 2015-05-28 11:08:42.000000000 +0200
@@ -230,12 +230,7 @@
pkgCache::PkgIterator pkgCache::FindPkg(const string &Name) {
size_t const found = Name.find(':');
if (found == string::npos)
- {
- if (MultiArchCache() == false)
- return SingleArchFindPkg(Name);
- else
- return FindPkg(Name, "native");
- }
+ return FindPkg(Name, "native");
string const Arch = Name.substr(found+1);
/* Beware: This is specialcased to handle pkg:any in dependencies as
these are linked to virtual pkg:any named packages with all archs.
@@ -249,13 +244,6 @@
// ---------------------------------------------------------------------
/* Returns 0 on error, pointer to the package otherwise */
pkgCache::PkgIterator pkgCache::FindPkg(const string &Name, string const &Arch) {
- if (MultiArchCache() == false && Arch != "none") {
- if (Arch == "native" || Arch == "all" || Arch == "any" ||
- Arch == NativeArch())
- return SingleArchFindPkg(Name);
- else
- return PkgIterator(*this,0);
- }
/* We make a detour via the GrpIterator here as
on a multi-arch environment a group is easier to
find than a package (less entries in the buckets) */
diff -Nru apt-1.0.9.8/apt-pkg/pkgcache.h apt-1.0.9.8.1/apt-pkg/pkgcache.h
--- apt-1.0.9.8/apt-pkg/pkgcache.h 2015-04-13 07:25:06.000000000 +0200
+++ apt-1.0.9.8.1/apt-pkg/pkgcache.h 2015-05-28 11:08:42.000000000 +0200
@@ -218,7 +218,7 @@
private:
bool MultiArchEnabled;
- PkgIterator SingleArchFindPkg(const std::string &Name);
+ APT_DEPRECATED PkgIterator SingleArchFindPkg(const std::string &Name);
};
/*}}}*/
// Header structure /*{{{*/
diff -Nru apt-1.0.9.8/configure apt-1.0.9.8.1/configure
--- apt-1.0.9.8/configure 2015-04-13 18:47:50.000000000 +0200
+++ apt-1.0.9.8.1/configure 2015-05-28 11:10:56.000000000 +0200
@@ -2436,7 +2436,7 @@
PACKAGE="apt"
-PACKAGE_VERSION="1.0.9.8"
+PACKAGE_VERSION="1.0.9.8.1"
PACKAGE_MAIL="APT Development Team <deity@lists.debian.org>"
cat >>confdefs.h <<_ACEOF
#define PACKAGE "$PACKAGE"
diff -Nru apt-1.0.9.8/configure.ac apt-1.0.9.8.1/configure.ac
--- apt-1.0.9.8/configure.ac 2015-04-13 18:47:48.000000000 +0200
+++ apt-1.0.9.8.1/configure.ac 2015-05-28 11:10:55.000000000 +0200
@@ -18,7 +18,7 @@
AC_CONFIG_HEADER(include/config.h:buildlib/config.h.in include/apti18n.h:buildlib/apti18n.h.in)
PACKAGE="apt"
-PACKAGE_VERSION="1.0.9.8"
+PACKAGE_VERSION="1.0.9.8.1"
PACKAGE_MAIL="APT Development Team <deity@lists.debian.org>"
AC_DEFINE_UNQUOTED(PACKAGE,"$PACKAGE")
AC_DEFINE_UNQUOTED(PACKAGE_VERSION,"$PACKAGE_VERSION")
diff -Nru apt-1.0.9.8/debian/changelog apt-1.0.9.8.1/debian/changelog
--- apt-1.0.9.8/debian/changelog 2015-04-13 07:25:06.000000000 +0200
+++ apt-1.0.9.8.1/debian/changelog 2015-05-28 11:08:42.000000000 +0200
@@ -1,3 +1,16 @@
+apt (1.0.9.8.1) stable; urgency=medium
+
+ [ Michael Vogt ]
+ * Fix endless loop in apt-get update that can cause disk fillup (LP: #1445239)
+
+ [ David Kalnischkies ]
+ * parse specific-arch dependencies correctly on single-arch systems
+ (Closes: 777760)
+ * remove "first package seen is native package" assumption.
+ Thanks to Axel Beckert for testing (Closes: 782777)
+
+ -- Michael Vogt <mvo@debian.org> Thu, 28 May 2015 11:07:45 +0200
+
apt (1.0.9.8) unstable; urgency=medium
[ David Kalnischkies ]
diff -Nru apt-1.0.9.8/debian/gbp.conf apt-1.0.9.8.1/debian/gbp.conf
--- apt-1.0.9.8/debian/gbp.conf 2015-04-13 07:25:06.000000000 +0200
+++ apt-1.0.9.8.1/debian/gbp.conf 2015-05-28 11:08:42.000000000 +0200
@@ -1,7 +1,7 @@
[DEFAULT]
prebuild = ./prepare-release pre-export
postbuild = ./prepare-release post-build
-debian-branch = debian/sid
+debian-branch = debian/jessie
debian-tag = %(version)s
export-dir = ../build-area
-sign-tags = True
\ No newline at end of file
+sign-tags = True
diff -Nru apt-1.0.9.8/doc/apt-verbatim.ent apt-1.0.9.8.1/doc/apt-verbatim.ent
--- apt-1.0.9.8/doc/apt-verbatim.ent 2015-04-13 18:47:48.000000000 +0200
+++ apt-1.0.9.8.1/doc/apt-verbatim.ent 2015-05-28 11:10:55.000000000 +0200
@@ -225,7 +225,7 @@
">
<!-- this will be updated by 'prepare-release' -->
-<!ENTITY apt-product-version "1.0.9.8">
+<!ENTITY apt-product-version "1.0.9.8.1">
<!-- (Code)names for various things used all over the place -->
<!ENTITY oldstable-codename "wheezy">
diff -Nru apt-1.0.9.8/methods/http.cc apt-1.0.9.8.1/methods/http.cc
--- apt-1.0.9.8/methods/http.cc 2015-04-13 07:25:06.000000000 +0200
+++ apt-1.0.9.8.1/methods/http.cc 2015-05-28 11:08:42.000000000 +0200
@@ -443,7 +443,7 @@
else if (JunkSize != 0)
In.Limit(JunkSize);
else
- In.Limit(Size - StartPos);
+ In.Limit(DownloadSize);
// Just transfer the whole block.
do
diff -Nru apt-1.0.9.8/methods/server.cc apt-1.0.9.8.1/methods/server.cc
--- apt-1.0.9.8/methods/server.cc 2015-04-13 07:25:06.000000000 +0200
+++ apt-1.0.9.8.1/methods/server.cc 2015-05-28 11:08:42.000000000 +0200
@@ -164,15 +164,22 @@
Encoding = Stream;
HaveContent = true;
- unsigned long long * SizePtr = &Size;
+ unsigned long long * DownloadSizePtr = &DownloadSize;
if (Result == 416)
- SizePtr = &JunkSize;
+ DownloadSizePtr = &JunkSize;
- *SizePtr = strtoull(Val.c_str(), NULL, 10);
- if (*SizePtr >= std::numeric_limits<unsigned long long>::max())
+ *DownloadSizePtr = strtoull(Val.c_str(), NULL, 10);
+ if (*DownloadSizePtr >= std::numeric_limits<unsigned long long>::max())
return _error->Errno("HeaderLine", _("The HTTP server sent an invalid Content-Length header"));
- else if (*SizePtr == 0)
+ else if (*DownloadSizePtr == 0)
HaveContent = false;
+
+ // On partial content (206) the Content-Length less than the real
+ // size, so do not set it here but leave that to the Content-Range
+ // header instead
+ if(Result != 206 && Size == 0)
+ Size = DownloadSize;
+
return true;
}
@@ -193,6 +200,9 @@
return _error->Error(_("The HTTP server sent an invalid Content-Range header"));
if ((unsigned long long)StartPos > Size)
return _error->Error(_("This HTTP server has broken range support"));
+
+ // figure out what we will download
+ DownloadSize = Size - StartPos;
return true;
}
diff -Nru apt-1.0.9.8/methods/server.h apt-1.0.9.8.1/methods/server.h
--- apt-1.0.9.8/methods/server.h 2015-04-13 07:25:06.000000000 +0200
+++ apt-1.0.9.8.1/methods/server.h 2015-05-28 11:08:42.000000000 +0200
@@ -34,7 +34,8 @@
char Code[360];
// These are some statistics from the last parsed header lines
- unsigned long long Size; // size of the usable content (aka: the file)
+ unsigned long long Size; // total size of the usable content (aka: the file)
+ unsigned long long DownloadSize; // size we actually download (can be smaller than Size if we have partial content)
unsigned long long JunkSize; // size of junk content (aka: server error pages)
unsigned long long StartPos;
time_t Date;
diff -Nru apt-1.0.9.8/test/integration/test-bug-782777-single-arch-weirdness apt-1.0.9.8.1/test/integration/test-bug-782777-single-arch-weirdness
--- apt-1.0.9.8/test/integration/test-bug-782777-single-arch-weirdness 1970-01-01 01:00:00.000000000 +0100
+++ apt-1.0.9.8.1/test/integration/test-bug-782777-single-arch-weirdness 2015-05-28 11:08:42.000000000 +0200
@@ -0,0 +1,72 @@
+#!/bin/sh
+# Ensure that the order in which packages are in the binary cache
+# does not effect if they can be found or not
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+setupenvironment
+configarchitecture 'i386'
+
+insertpackage 'unstable' 'abar' 'i386' '1'
+insertpackage 'unstable' 'foobar' 'i386' '1' 'Depends: abar:amd64, zfoo:amd64'
+insertpackage 'unstable' 'zfoo' 'i386' '1'
+
+setupaptarchive
+
+testrun() {
+ rm -f rootdir/var/lib/apt/extended_states
+
+ testequal 'Reading package lists...
+Building dependency tree...
+The following NEW packages will be installed:
+ abar zfoo
+0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
+Inst abar (1 unstable [i386])
+Inst zfoo (1 unstable [i386])
+Conf abar (1 unstable [i386])
+Conf zfoo (1 unstable [i386])' aptget install abar zfoo -s
+
+ testequal 'Reading package lists...
+Building dependency tree...
+The following NEW packages will be installed:
+ abar zfoo
+0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
+Inst abar (1 unstable [i386])
+Inst zfoo (1 unstable [i386])
+Conf abar (1 unstable [i386])
+Conf zfoo (1 unstable [i386])' aptget install abar:i386 zfoo:i386 -s
+
+ testequal "Reading package lists...
+Building dependency tree...
+Package abar:amd64 is not available, but is referred to by another package.
+This may mean that the package is missing, has been obsoleted, or
+is only available from another source
+
+Package zfoo:amd64 is not available, but is referred to by another package.
+This may mean that the package is missing, has been obsoleted, or
+is only available from another source
+
+E: Package 'abar:amd64' has no installation candidate
+E: Package 'zfoo:amd64' has no installation candidate" aptget install abar:amd64 zfoo:amd64 -s
+
+ cp -f rootdir/var/lib/dpkg/status status.backup
+ insertinstalledpackage 'abar' 'i386' '1'
+ insertinstalledpackage 'zfoo' 'i386' '1'
+
+ testequal 'abar
+zfoo' aptmark showmanual abar zfoo
+ testequal 'abar set to automatically installed.
+zfoo set to automatically installed.' aptmark auto abar zfoo
+ testempty aptmark showmanual abar zfoo
+ testequal 'abar
+zfoo' aptmark showauto abar zfoo
+
+ mv -f status.backup rootdir/var/lib/dpkg/status
+}
+
+msgmsg 'Single-Arch testrun'
+testrun
+msgmsg 'Multi-Arch testrun'
+configarchitecture 'i386' 'amd64'
+testrun
diff -Nru apt-1.0.9.8/test/integration/test-bug-lp1445239-download-loop apt-1.0.9.8.1/test/integration/test-bug-lp1445239-download-loop
--- apt-1.0.9.8/test/integration/test-bug-lp1445239-download-loop 1970-01-01 01:00:00.000000000 +0100
+++ apt-1.0.9.8.1/test/integration/test-bug-lp1445239-download-loop 2015-05-28 11:08:42.000000000 +0200
@@ -0,0 +1,29 @@
+#!/bin/sh
+#
+# this is a regression test for LP: #1445239 where a partial download can
+# trigger an endless hang of the download method
+#
+
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+setupenvironment
+configarchitecture 'amd64'
+
+changetowebserver
+webserverconfig 'aptwebserver::support::range' 'true'
+
+TESTFILE='aptarchive/testfile'
+dd if=/dev/zero of=$TESTFILE bs=100k count=1 2>/dev/null
+
+DOWNLOADLOG='rootdir/tmp/testdownloadfile.log'
+
+TARGET=testfile-downloaded
+dd if=/dev/zero of=$TARGET bs=99k count=1 2>/dev/null
+if ! downloadfile http://localhost:8080/testfile "$TARGET" > "$DOWNLOADLOG"; then
+ cat >&2 "$DOWNLOADLOG"
+ msgfail
+else
+ msgpass
+fi
diff -Nru apt-1.0.9.8/test/interactive-helper/aptwebserver.cc apt-1.0.9.8.1/test/interactive-helper/aptwebserver.cc
--- apt-1.0.9.8/test/interactive-helper/aptwebserver.cc 2015-04-13 07:25:06.000000000 +0200
+++ apt-1.0.9.8.1/test/interactive-helper/aptwebserver.cc 2015-05-28 11:08:42.000000000 +0200
@@ -654,13 +654,15 @@
if (filesize > filestart)
{
data.Skip(filestart);
- std::ostringstream contentlength;
- contentlength << "Content-Length: " << (filesize - filestart);
- headers.push_back(contentlength.str());
+ // make sure to send content-range before conent-length
+ // as regression test for LP: #1445239
std::ostringstream contentrange;
contentrange << "Content-Range: bytes " << filestart << "-"
<< filesize - 1 << "/" << filesize;
headers.push_back(contentrange.str());
+ std::ostringstream contentlength;
+ contentlength << "Content-Length: " << (filesize - filestart);
+ headers.push_back(contentlength.str());
sendHead(client, 206, headers);
if (sendContent == true)
sendFile(client, headers, data);
--- End Message ---