Commit a5449928 authored by bescoto's avatar bescoto

Fix for perm-changer bug


git-svn-id: http://svn.savannah.nongnu.org/svn/rdiff-backup@533 2b77aa54-bcbc-44c9-a7ec-4f6cf2b41109
parent f75a6d77
...@@ -10,6 +10,8 @@ Fix by Dean Gaudet for --calculate-average mode (it broke somewhere in ...@@ -10,6 +10,8 @@ Fix by Dean Gaudet for --calculate-average mode (it broke somewhere in
Fix for regress warning code: rdiff-backup should warn you if you are Fix for regress warning code: rdiff-backup should warn you if you are
trying to back up a directory into itself. trying to back up a directory into itself.
Fix for restoring certain directories when not run as root.
Now when determining group permissions check supplementary groups as Now when determining group permissions check supplementary groups as
well as main group. (Bug report by Ryan Castle.) well as main group. (Bug report by Ryan Castle.)
......
...@@ -348,7 +348,7 @@ class CachedRF: ...@@ -348,7 +348,7 @@ class CachedRF:
if not self.add_rfs(index): return None if not self.add_rfs(index): return None
rf = self.rf_list[0] rf = self.rf_list[0]
if rf.index == index: if rf.index == index:
if Globals.process_uid != 0: self.perm_changer(rf.mirror_rp) if Globals.process_uid != 0: self.perm_changer(index)
return rf return rf
elif rf.index > index: elif rf.index > index:
# Try to add earlier indicies. But if first is # Try to add earlier indicies. But if first is
...@@ -377,9 +377,9 @@ The cause is probably data loss from the destination directory.""" % ...@@ -377,9 +377,9 @@ The cause is probably data loss from the destination directory.""" %
""" """
if not index: return self.root_rf if not index: return self.root_rf
parent_index = index[:-1] parent_index = index[:-1]
if Globals.process_uid != 0: self.perm_changer(parent_index)
temp_rf = RestoreFile(self.root_rf.mirror_rp.new_index(parent_index), temp_rf = RestoreFile(self.root_rf.mirror_rp.new_index(parent_index),
self.root_rf.inc_rp.new_index(parent_index), []) self.root_rf.inc_rp.new_index(parent_index), [])
if Globals.process_uid != 0: self.perm_changer(temp_rf.mirror_rp)
new_rfs = list(temp_rf.yield_sub_rfs()) new_rfs = list(temp_rf.yield_sub_rfs())
if not new_rfs: if not new_rfs:
log.Log("Warning: No RFs added for index %s" % (index,), 2) log.Log("Warning: No RFs added for index %s" % (index,), 2)
...@@ -690,16 +690,15 @@ class PermissionChanger: ...@@ -690,16 +690,15 @@ class PermissionChanger:
# order that need clearing # order that need clearing
self.open_index_list = [] self.open_index_list = []
def __call__(self, rp): def __call__(self, index):
"""Given rpath, change permissions up and including rp""" """Given rpath, change permissions up to and including index"""
index, old_index = rp.index, self.current_index old_index = self.current_index
self.current_index = index self.current_index = index
if not index or index == old_index: return if not index or index <= old_index: return
assert index > old_index, (index, old_index) self.restore_old(index)
self.restore_old(rp, index) self.add_new(old_index, index)
self.add_new(rp, old_index, index)
def restore_old(self, rp, index): def restore_old(self, index):
"""Restore permissions for indicies we are done with""" """Restore permissions for indicies we are done with"""
while self.open_index_list: while self.open_index_list:
old_index, old_rp, old_perms = self.open_index_list[0] old_index, old_rp, old_perms = self.open_index_list[0]
...@@ -707,29 +706,31 @@ class PermissionChanger: ...@@ -707,29 +706,31 @@ class PermissionChanger:
else: break else: break
del self.open_index_list[0] del self.open_index_list[0]
def add_new(self, rp, old_index, index): def add_new(self, old_index, index):
"""Change permissions of directories between old_index and index""" """Change permissions of directories between old_index and index"""
for rp in self.get_new_rp_list(rp, old_index, index): for rp in self.get_new_rp_list(old_index, index):
if ((rp.isreg() and not rp.readable()) or if ((rp.isreg() and not rp.readable()) or
(rp.isdir() and not rp.hasfullperms())): (rp.isdir() and not rp.hasfullperms())):
old_perms = rp.getperms() old_perms = rp.getperms()
self.open_index_list.insert(0, (index, rp, old_perms)) self.open_index_list.insert(0, (rp.index, rp, old_perms))
if rp.isreg(): rp.chmod(0400 | old_perms) if rp.isreg(): rp.chmod(0400 | old_perms)
else: rp.chmod(0700 | old_perms) else: rp.chmod(0700 | old_perms)
def get_new_rp_list(self, rp, old_index, index): def get_new_rp_list(self, old_index, index):
"""Return list of new rp's between old_index and index""" """Return list of new rp's between old_index and index
Do this lazily so that the permissions on the outer
directories are fixed before we need the inner dirs.
"""
for i in range(len(index)-1, -1, -1): for i in range(len(index)-1, -1, -1):
if old_index[:i] == index[:i]: if old_index[:i] == index[:i]:
common_prefix_len = i common_prefix_len = i
break break
else: assert 0 else: assert 0
new_rps = [] for total_len in range(common_prefix_len+1, len(index)+1):
for total_len in range(common_prefix_len+1, len(index)): yield self.root_rp.new_index(index[:total_len])
new_rps.append(self.root_rp.new_index(index[:total_len]))
new_rps.append(rp)
return new_rps
def finish(self): def finish(self):
"""Restore any remaining rps""" """Restore any remaining rps"""
......
...@@ -124,6 +124,21 @@ class HalfRoot(unittest.TestCase): ...@@ -124,6 +124,21 @@ class HalfRoot(unittest.TestCase):
rp2_3_3 = rp2_3.append('file2') rp2_3_3 = rp2_3.append('file2')
rp2_3_3.touch() rp2_3_3.touch()
rp2_3.chmod(0) rp2_3.chmod(0)
# The rp_2_4 below test for a perm error, also tested in
# regressiontest.py testConfig1
rp2_4 = rp2.append('test2')
rp2_4.mkdir()
rp2_4_1 = rp2_4.append('1-dir')
rp2_4_1.mkdir()
reg2_4_1_1 = rp2_4_1.append('reg')
reg2_4_1_1.touch()
reg2_4_1_1.chmod(0)
rp2_4_1.chmod(0)
reg2_4_2 = rp2_4.append('2-reg')
reg2_4_2.touch()
reg2_4_2.chmod(0)
rp2_4.chmod(0)
return rp1, rp2 return rp1, rp2
def cause_regress(self, rp): def cause_regress(self, rp):
......
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