Преглед изворни кода

dpkg-divert: Check all dpkg-divert filename arguments

This makes sure the filename is absolute and does not contain newlines.

Closes: #21722
Guillem Jover пре 14 година
родитељ
комит
1a7d184fc6
3 измењених фајлова са 25 додато и 5 уклоњено
  1. 2 0
      debian/changelog
  2. 16 4
      src/divertcmd.c
  3. 7 1
      src/t/100_dpkg_divert.t

+ 2 - 0
debian/changelog

@@ -4,6 +4,8 @@ dpkg (1.16.3) UNRELEASED; urgency=low
   * Do not look for newline beyond the read buffer on dpkg-deb extract.
   * Check update-alternative name and link arguments for all commands.
     Closes: #665050
+  * Check all dpkg-divert filename arguments to be absolute and to not
+    contain newlines. Closes: #21722
 
   [ Updated dpkg translations ]
   * French (Christian Perrier)

+ 16 - 4
src/divertcmd.c

@@ -262,6 +262,15 @@ file_rename(struct file *src, struct file *dst)
 	}
 }
 
+static void
+diversion_check_filename(const char *filename)
+{
+	if (filename[0] != '/')
+		badusage(_("filename \"%s\" is not absolute"), filename);
+	if (strchr(filename, '\n') != NULL)
+		badusage(_("file may not contain newlines"));
+}
+
 static const char *
 diversion_pkg_name(struct diversion *d)
 {
@@ -388,10 +397,7 @@ diversion_add(const char *const *argv)
 	if (!filename || argv[1])
 		badusage(_("--%s needs a single argument"), cipaction->olong);
 
-	if (filename[0] != '/')
-		badusage(_("filename \"%s\" is not absolute"), filename);
-	if (strchr(filename, '\n') != NULL)
-		badusage(_("file may not contain newlines"));
+	diversion_check_filename(filename);
 
 	file_init(&file_from, filename);
 	file_stat(&file_from);
@@ -515,6 +521,8 @@ diversion_remove(const char *const *argv)
 	if (!filename || argv[1])
 		badusage(_("--%s needs a single argument"), cipaction->olong);
 
+	diversion_check_filename(filename);
+
 	namenode = findnamenode(filename, fnn_nonew);
 
 	if (namenode == NULL || namenode->divert == NULL ||
@@ -631,6 +639,8 @@ diversion_truename(const char *const *argv)
 	if (!filename || argv[1])
 		badusage(_("--%s needs a single argument"), cipaction->olong);
 
+	diversion_check_filename(filename);
+
 	namenode = findnamenode(filename, fnn_nonew);
 
 	/* Print the given name if file is not diverted. */
@@ -651,6 +661,8 @@ diversion_listpackage(const char *const *argv)
 	if (!filename || argv[1])
 		badusage(_("--%s needs a single argument"), cipaction->olong);
 
+	diversion_check_filename(filename);
+
 	namenode = findnamenode(filename, fnn_nonew);
 
 	/* Print nothing if file is not diverted. */

+ 7 - 1
src/t/100_dpkg_divert.t

@@ -33,7 +33,7 @@ if (! -x "@dd") {
     exit(0);
 }
 
-plan tests => 239;
+plan tests => 251;
 
 sub cleanup {
     system("rm -rf $tmpdir && mkdir -p $testdir");
@@ -151,8 +151,14 @@ call_divert_badusage(['--add', "/foo\nbar"], qr/newline/);
 call_divert_badusage(['--add', "$testdir"], qr/director(y|ies)/);
 call_divert_badusage(['--add', "--divert", "bar", "/foo/bar"], qr/absolute/);
 call_divert_badusage(['--remove'], qr/needs a single argument/);
+call_divert_badusage(['--remove', 'foo'], qr/absolute/);
+call_divert_badusage(['--remove', "/foo\nbar"], qr/newline/);
 call_divert_badusage(['--listpackage'], qr/needs a single argument/);
+call_divert_badusage(['--listpackage', 'foo'], qr/absolute/);
+call_divert_badusage(['--listpackage', "/foo\nbar"], qr/newline/);
 call_divert_badusage(['--truename'], qr/needs a single argument/);
+call_divert_badusage(['--truename', 'foo'], qr/absolute/);
+call_divert_badusage(['--truename', "/foo\nbar"], qr/newline/);
 call([@dd, '--admindir'], [],
      expect_failure => 1, expect_stderr_like => qr/(takes a value|needs.*argument)/);