]> git.saurik.com Git - apt.git/commitdiff
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 eee758b7a124d388ac1d1fe1c9cb84c38d6fe806..a0dd15cd831d1e5661e564ba1e173d10da97ef81 100644 (file)
@@ -525,7 +525,7 @@ bool debTranslationsIndex::Merge(pkgCacheGenerator &Gen,OpProgress *Prog) const
    if (FileExists(TranslationFile))
    {
      FileFd Trans(TranslationFile,FileFd::ReadOnly, FileFd::Extension);
    if (FileExists(TranslationFile))
    {
      FileFd Trans(TranslationFile,FileFd::ReadOnly, FileFd::Extension);
-     debListParser TransParser(&Trans);
+     debTranslationsParser TransParser(&Trans);
      if (_error->PendingError() == true)
        return false;
      
      if (_error->PendingError() == true)
        return false;
      
index baace79fe1f632f5bb25f565afba015a3e4061fb..3b6963211649d503454bab13a1b6c6e1a5f3f2de 100644 (file)
@@ -106,4 +106,15 @@ class debListParser : public pkgCacheGenerator::ListParser
    APT_HIDDEN unsigned char ParseMultiArch(bool const showErrors);
 };
 
    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
 #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