소스 검색

chmod should be called before chown to avoid SUID and SGRP reset.

Jonas Borgström 12 년 전
부모
커밋
b994203c01
2개의 변경된 파일5개의 추가작업 그리고 5개의 파일을 삭제
  1. 4 4
      darc/archive.py
  2. 1 1
      darc/test.py

+ 4 - 4
darc/archive.py

@@ -285,10 +285,6 @@ class Archive(object):
                     xa.set(k, v)
                 except (IOError, KeyError):
                     pass
-        if have_lchmod:
-            os.lchmod(path, item['mode'])
-        elif not symlink:
-            os.chmod(path, item['mode'])
         uid = gid = None
         if not self.numeric_owner:
             uid = user2uid(item['user'])
@@ -299,6 +295,10 @@ class Archive(object):
             os.lchown(path, uid, gid)
         except OSError:
             pass
+        if have_lchmod:
+            os.lchmod(path, item['mode'])
+        elif not symlink:
+            os.chmod(path, item['mode'])
         if not symlink:
             # FIXME: We should really call futimes here (c extension required)
             os.utime(path, (item['mtime'], item['mtime']))

+ 1 - 1
darc/test.py

@@ -104,7 +104,7 @@ class Test(unittest.TestCase):
         # File owner
         os.chown('input/file1', 100, 200)
         # File mode
-        os.chmod('input/file1', 0600)
+        os.chmod('input/file1', 7755)
         os.chmod('input/dir2', 0700)
         # Block device
         os.mknod('input/bdev', 0600 | stat.S_IFBLK,  os.makedev(10, 20))