Commit 9e14bbda authored by owsla's avatar owsla

- Replace is_readable() function with pre-existing readable() function

- Close Savannah bug #21202 by not assuming that file cannot be opened
even if read permissions don't indicate such.


git-svn-id: http://svn.savannah.nongnu.org/svn/rdiff-backup@855 2b77aa54-bcbc-44c9-a7ec-4f6cf2b41109
parent da2cca60
New in v1.1.15 (????/??/??)
---------------------------
Don't assume that a file cannot be read simply becasue of the access
permissions -- eg, NFS with (rw,all_squash) options. Closes Savannah
bug #21202. (Based on patch from Marc Horowitz)
restore_set_root should check if it can read a particular directory
before checking if "rdiff-backup-data" is contained in it. Closes
Savannah bug #21106. (Patch from Alex Chapman)
......
......@@ -598,7 +598,7 @@ def restore_set_root(rpin):
i = len(pathcomps)
while i >= min_len_pathcomps:
parent_dir = rpath.RPath(rpin.conn, "/".join(pathcomps[:i]))
if (parent_dir.isdir() and parent_dir.is_readable() and
if (parent_dir.isdir() and parent_dir.readable() and
"rdiff-backup-data" in parent_dir.listdir()): break
if parent_dir.path == rpin.conn.Globals.get('restrict_path'):
return None
......
......@@ -202,14 +202,21 @@ class DestinationStruct:
log.ErrorLog.write_if_open("UpdateError", dest_rp,
"File changed from regular file before signature")
return None
if Globals.process_uid != 0 and not dest_rp.readable():
if (Globals.process_uid != 0 and not dest_rp.readable() and
dest_rp.isowner()):
# This branch can happen with root source and non-root
# destination. Permissions are changed permanently, which
# should propogate to the diffs
assert dest_rp.isowner(), 'no ownership of %s' % (dest_rp.path,)
dest_rp.chmod(0400 | dest_rp.getperms())
return Rdiff.get_signature(dest_rp)
try:
return Rdiff.get_signature(dest_rp)
except IOError, e:
if (e.errno == errno.EPERM):
log.Log.FatalError("Could not open %s for reading. Check "
"permissions on file." % (dest_rp.path,))
else:
raise
def patch(cls, dest_rpath, source_diffiter, start_index = ()):
"""Patch dest_rpath with an rorpiter of diffs"""
ITR = rorpiter.IterTreeReducer(PatchITRB, [dest_rpath, cls.CCPP])
......
......@@ -599,10 +599,6 @@ class RORPath:
"""Signal that rorp is a signature/diff for a hardlink file"""
self.data['linked'] = index
def is_readable(self):
"""Check whether user can read the file or directory"""
return self.conn.os.access(self.path, self.conn.os.R_OK)
def open(self, mode):
"""Return file type object if any was given using self.setfile"""
if mode != "rb": raise RPathException("Bad mode %s" % mode)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment