public inbox for gentoo-portage-dev@lists.gentoo.org
 help / color / mirror / Atom feed
* [gentoo-portage-dev] [PATCH] ro_checker: only check nearest parent (bug 547390)
@ 2015-04-27  3:08 Zac Medico
  2015-04-27  3:59 ` [gentoo-portage-dev] [PATCH v2] " Zac Medico
  2015-04-27  4:30 ` [gentoo-portage-dev] [PATCH v3] " Zac Medico
  0 siblings, 2 replies; 4+ messages in thread
From: Zac Medico @ 2015-04-27  3:08 UTC (permalink / raw
  To: gentoo-portage-dev; +Cc: Zac Medico

The ro_checker code added in commit
47ef9a0969474f963dc8e52bfbbb8bc075e8d73c incorrectly asserts that all
parent directories be writable. Fix it to only assert that the nearest
parent directory be writable.

Fixes 47ef9a096947: ("Test for read-only filesystems, fixes bug 378869")
X-Gentoo-Bug: 547390
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=547390
---
 pym/portage/dbapi/vartree.py | 44 +++++++++++++++++++++++++-------------------
 1 file changed, 25 insertions(+), 19 deletions(-)

diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py
index 1c0deab..c59d778 100644
--- a/pym/portage/dbapi/vartree.py
+++ b/pym/portage/dbapi/vartree.py
@@ -33,7 +33,7 @@ portage.proxy.lazyimport.lazyimport(globals(),
 	'portage.util.env_update:env_update',
 	'portage.util.listdir:dircache,listdir',
 	'portage.util.movefile:movefile',
-	'portage.util.path:first_existing',
+	'portage.util.path:first_existing,iter_parents',
 	'portage.util.writeable_check:get_ro_checker',
 	'portage.util._dyn_libs.PreservedLibsRegistry:PreservedLibsRegistry',
 	'portage.util._dyn_libs.LinkageMapELF:LinkageMapELF@LinkageMap',
@@ -3325,6 +3325,8 @@ class dblink(object):
 			showMessage = self._display_merge
 			stopmerge = False
 			collisions = []
+			dirs = set()
+			dirs_ro = set()
 			symlink_collisions = []
 			destroot = self.settings['ROOT']
 			showMessage(_(" %s checking %d files for package collisions\n") % \
@@ -3337,6 +3339,18 @@ class dblink(object):
 
 				dest_path = normalize_path(
 					os.path.join(destroot, f.lstrip(os.path.sep)))
+
+				parent = os.path.dirname(dest_path)
+				if parent not in dirs:
+					for x in iter_parents(parent):
+						if x in dirs:
+							break
+						dirs.add(x)
+						if os.path.isdir(x):
+							if not os.access(x, os.W_OK):
+								dirs_ro.add(x)
+							break
+
 				try:
 					dest_lstat = os.lstat(dest_path)
 				except EnvironmentError as e:
@@ -3410,7 +3424,7 @@ class dblink(object):
 							break
 					if stopmerge:
 						collisions.append(f)
-			return collisions, symlink_collisions, plib_collisions
+			return collisions, dirs_ro, symlink_collisions, plib_collisions
 
 	def _lstat_inode_map(self, path_iter):
 		"""
@@ -3759,7 +3773,6 @@ class dblink(object):
 			eagain_error = False
 
 			filelist = []
-			dirlist = []
 			linklist = []
 			paths_with_newlines = []
 			def onerror(e):
@@ -3792,13 +3805,6 @@ class dblink(object):
 					unicode_errors.append(new_parent[ed_len:])
 					break
 
-				relative_path = parent[srcroot_len:]
-				if len(relative_path) >= eprefix_len:
-					# Files are never installed outside of the prefix,
-					# therefore we skip the readonly filesystem check for
-					# parent directories of the prefix (see bug 544624).
-					dirlist.append(os.path.join(destroot, relative_path))
-
 				for fname in files:
 					try:
 						fname = _unicode_decode(fname,
@@ -3911,9 +3917,17 @@ class dblink(object):
 			for other in others_in_slot])
 		prepare_build_dirs(settings=self.settings, cleanup=cleanup)
 
+		# check for package collisions
+		blockers = self._blockers
+		if blockers is None:
+			blockers = []
+		collisions, dirs_ro, symlink_collisions, plib_collisions = \
+			self._collision_protect(srcroot, destroot,
+			others_in_slot + blockers, filelist, linklist)
+
 		# Check for read-only filesystems.
 		ro_checker = get_ro_checker()
-		rofilesystems = ro_checker(dirlist)
+		rofilesystems = ro_checker(dirs_ro)
 
 		if rofilesystems:
 			msg = _("One or more files installed to this package are "
@@ -3935,14 +3949,6 @@ class dblink(object):
 			eerror(msg)
 			return 1
 
-		# check for package collisions
-		blockers = self._blockers
-		if blockers is None:
-			blockers = []
-		collisions, symlink_collisions, plib_collisions = \
-			self._collision_protect(srcroot, destroot,
-			others_in_slot + blockers, filelist, linklist)
-
 		if symlink_collisions:
 			# Symlink collisions need to be distinguished from other types
 			# of collisions, in order to avoid confusion (see bug #409359).
-- 
2.3.5



^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2015-04-28 20:48 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-04-27  3:08 [gentoo-portage-dev] [PATCH] ro_checker: only check nearest parent (bug 547390) Zac Medico
2015-04-27  3:59 ` [gentoo-portage-dev] [PATCH v2] " Zac Medico
2015-04-27  4:30 ` [gentoo-portage-dev] [PATCH v3] " Zac Medico
2015-04-28 20:48   ` Brian Dolbec

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox