瀏覽代碼

Never parse Version/Architecture tags in a Translation-$lang file

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.
Michael Vogt 12 年之前
父節點
當前提交
bc1c9081e8
共有 3 個文件被更改,包括 53 次插入1 次删除
  1. 1 1
      apt-pkg/deb/debindexfile.cc
  2. 11 0
      apt-pkg/deb/deblistparser.h
  3. 41 0
      test/integration/test-apt-translation-has-no-packages

+ 1 - 1
apt-pkg/deb/debindexfile.cc

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

+ 11 - 0
apt-pkg/deb/deblistparser.h

@@ -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

+ 41 - 0
test/integration/test-apt-translation-has-no-packages

@@ -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