[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#787067: jessie-pu: package apt/1.0.9.8



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);

Reply to: