From 1ccfda6c51ba4980e233baa8f3958fd05840a59a Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Sat, 15 Nov 2008 04:12:00 +0000 Subject: Bug #216190 - Make dblink.treewalk() bail out rather than install a package with file paths containing newlines. svn path=/main/trunk/; revision=11918 --- pym/portage/dbapi/vartree.py | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py index d8e676e8c..38d1081a4 100644 --- a/pym/portage/dbapi/vartree.py +++ b/pym/portage/dbapi/vartree.py @@ -3081,19 +3081,40 @@ class dblink(object): myfilelist = [] mylinklist = [] + paths_with_newlines = [] + srcroot_len = len(srcroot) def onerror(e): raise for parent, dirs, files in os.walk(srcroot, onerror=onerror): for f in files: file_path = os.path.join(parent, f) + relative_path = file_path[srcroot_len:] + + if "\n" in relative_path: + paths_with_newlines.append(relative_path) + file_mode = os.lstat(file_path).st_mode if stat.S_ISREG(file_mode): - myfilelist.append(file_path[len(srcroot):]) + myfilelist.append(relative_path) elif stat.S_ISLNK(file_mode): # Note: os.walk puts symlinks to directories in the "dirs" # list and it does not traverse them since that could lead # to an infinite recursion loop. - mylinklist.append(file_path[len(srcroot):]) + mylinklist.append(relative_path) + + if paths_with_newlines: + msg = [] + msg.append("This package installs one or more files containing") + msg.append("a newline (\\n) character:") + msg.append("") + paths_with_newlines.sort() + for f in paths_with_newlines: + msg.append("\t/%s" % (f.replace("\n", "\\n"))) + msg.append("") + msg.append("package %s NOT merged" % self.mycpv) + msg.append("") + eerror(msg) + return 1 # If there are no files to merge, and an installed package in the same # slot has files, it probably means that something went wrong. -- cgit v1.2.3-1-g7c22