diff options
author | Zac Medico <zmedico@gentoo.org> | 2008-11-15 04:12:00 +0000 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2008-11-15 04:12:00 +0000 |
commit | 1ccfda6c51ba4980e233baa8f3958fd05840a59a (patch) | |
tree | d75b79694ff4a5b4640c233c46b91de05ea41c15 | |
parent | f18540f507de4b434c0dfccbcea747654c32b431 (diff) | |
download | portage-1ccfda6c51ba4980e233baa8f3958fd05840a59a.tar.gz portage-1ccfda6c51ba4980e233baa8f3958fd05840a59a.tar.bz2 portage-1ccfda6c51ba4980e233baa8f3958fd05840a59a.zip |
Bug #216190 - Make dblink.treewalk() bail out rather than install a package
with file paths containing newlines.
svn path=/main/trunk/; revision=11918
-rw-r--r-- | pym/portage/dbapi/vartree.py | 25 |
1 files 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. |