浏览代码

dpkg: Do not fail on version parsing warnings in --compare-versions

The bogus versions might get fed into «dpkg --compare-versions» by
way of maintainer scripts, which would get the bogus versions from
the database, somewhere dpkg still allows those to exist.
Guillem Jover 15 年之前
父节点
当前提交
d918d025f1
共有 2 个文件被更改,包括 15 次插入4 次删除
  1. 3 0
      debian/changelog
  2. 12 4
      src/enquiry.c

+ 3 - 0
debian/changelog

@@ -215,6 +215,9 @@ dpkg (1.16.1) UNRELEASED; urgency=low
     it does not end up pulling triglib.
   * Reduce dpkg-deb binary size by refectoring libdpkg modules so that it
     does not end up pulling triglib.
+  * Do not fail on --compare-version when generating parse warnings.
+    Existing packages with invalid versions should not fail on their
+    maintainer scripts due to that.
 
   [ Updated dpkg translations ]
   * German (Sven Joachim). Closes: #620312

+ 12 - 4
src/enquiry.c

@@ -524,14 +524,22 @@ cmpversions(const char *const *argv)
   if (!rip->string) badusage(_("--compare-versions bad relation"));
 
   if (*argv[0] && strcmp(argv[0],"<unknown>")) {
-    if (parseversion(&a, argv[0], &err) < 0)
-      ohshit(_("version '%s' has bad syntax: %s"), argv[0], err.str);
+    if (parseversion(&a, argv[0], &err) < 0) {
+      if (err.type == DPKG_MSG_WARN)
+        warning(_("version '%s' has bad syntax: %s"), argv[0], err.str);
+      else
+        ohshit(_("version '%s' has bad syntax: %s"), argv[0], err.str);
+    }
   } else {
     blankversion(&a);
   }
   if (*argv[2] && strcmp(argv[2],"<unknown>")) {
-    if (parseversion(&b, argv[2], &err) < 0)
-      ohshit(_("version '%s' has bad syntax: %s"), argv[2], err.str);
+    if (parseversion(&b, argv[2], &err) < 0) {
+      if (err.type == DPKG_MSG_WARN)
+        warning(_("version '%s' has bad syntax: %s"), argv[2], err.str);
+      else
+        ohshit(_("version '%s' has bad syntax: %s"), argv[2], err.str);
+    }
   } else {
     blankversion(&b);
   }