Never parse Version/Architecture tags in a Translation-$lang file
authorMichael Vogt <mvo@ubuntu.com>
Thu, 15 May 2014 12:37:33 +0000 (14:37 +0200)
committerMichael Vogt <mvo@ubuntu.com>
Thu, 15 May 2014 12:37:33 +0000 (14:37 +0200)
Version/Architecture information in a Translation-$lang file is
not allowed, so don't try to parse it. This is a fix for a bugreport
where a Translation-en file contained the content of the regular
Packages file (probably due to local FS corruption). This lead to
strange error messages on file download.

Thanks to Thomas Reusch for the report.

apt-pkg/deb/debindexfile.cc
apt-pkg/deb/deblistparser.h
test/integration/test-apt-translation-has-no-packages [new file with mode: 0755]

index eee758b..a0dd15c 100644 (file)
@@ -525,7 +525,7 @@ bool debTranslationsIndex::Merge(pkgCacheGenerator &Gen,OpProgress *Prog) const
    if (FileExists(TranslationFile))
    {
      FileFd Trans(TranslationFile,FileFd::ReadOnly, FileFd::Extension);
-     debListParser TransParser(&Trans);
+     debTranslationsParser TransParser(&Trans);
      if (_error->PendingError() == true)
        return false;
      
index baace79..3b69632 100644 (file)
@@ -106,4 +106,15 @@ class debListParser : public pkgCacheGenerator::ListParser
    APT_HIDDEN unsigned char ParseMultiArch(bool const showErrors);
 };
 
+class debTranslationsParser : public debListParser
+{
+ public:
+   // a translation can never be a real package
+   virtual std::string Architecture() { return ""; }
+   virtual std::string Version() { return ""; }
+
+   debTranslationsParser(FileFd *File, std::string const &Arch = "")
+      : debListParser(File, Arch) {};
+};
+
 #endif
diff --git a/test/integration/test-apt-translation-has-no-packages b/test/integration/test-apt-translation-has-no-packages
new file mode 100755 (executable)
index 0000000..bb2353a
--- /dev/null
@@ -0,0 +1,41 @@
+#!/bin/sh
+#
+# Due to corruption (local or network) a user might end up with a
+# Translation-$lang file on disk that is actually a Packages file. In this
+# case apt used to generate invalid package versions out of the
+# Translation-$lang file (i.e. apt-cache policy foo) would show a version
+# comming out of a Translation file. Downloading this versions fails as
+# there is no acquire method available for the package
+#
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+
+setupenvironment
+configarchitecture "amd64"
+
+if [ ! -x ${BUILDDIRECTORY}/apt ]; then
+    msgmsg "No ${BUILDDIRECTORY}/apt"
+    msgskip 
+    exit 0
+fi
+
+buildsimplenativepackage 'foo' 'all' '1.0'
+setupaptarchive
+
+APTARCHIVE=$(readlink -f ./aptarchive)
+
+# corrupt the Translation-en file to look like a regular Packages file
+rm rootdir/var/cache/apt/*.bin
+cp $APTARCHIVE/dists/unstable/main/binary-amd64/Packages \
+   rootdir/var/lib/apt/lists/*Translation-en
+
+# ensure that there is no Version for the package foo generated out of
+# the corrupted Translation-en file
+testequal "foo:
+  Installed: (none)
+  Candidate: 1.0
+  Version table:
+     1.0 0
+        500 file:$APTARCHIVE/ unstable/main amd64 Packages" aptcache policy foo