diff options
| author | Csaba Henk <csaba@gluster.com> | 2011-09-19 15:47:46 +0200 | 
|---|---|---|
| committer | Vijay Bellur <vijay@gluster.com> | 2011-09-22 05:24:23 -0700 | 
| commit | d7c9d2bfbd20727f90b0118c982ff9612aacacf2 (patch) | |
| tree | fec55d5fe5a85c4855ef2aaf6472fdfb882f5e14 | |
| parent | 7e04913aa6f4ddb45e95099ef648564bf90da0b3 (diff) | |
geo-rep: gsyncd: make sure path operations do not act outside the volume
Change-Id: I2da62b34aa833b9a28728fa1db23951f28b7e538
BUG: 2825
Reviewed-on: http://review.gluster.com/462
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vijay@gluster.com>
| -rw-r--r-- | xlators/features/marker/utils/syncdaemon/resource.py | 28 | 
1 files changed, 28 insertions, 0 deletions
diff --git a/xlators/features/marker/utils/syncdaemon/resource.py b/xlators/features/marker/utils/syncdaemon/resource.py index b851d661a9e..821c51a1434 100644 --- a/xlators/features/marker/utils/syncdaemon/resource.py +++ b/xlators/features/marker/utils/syncdaemon/resource.py @@ -210,7 +210,28 @@ class Server(object):      FRGN_XTRA_FMT = "I"      FRGN_FMTSTR = NTV_FMTSTR + FRGN_XTRA_FMT +    def _pathguard(f): +        """decorator method that checks +        the path argument of the decorated +        functions to make sure it does not +        point out of the managed tree +        """ + +        fc = getattr(f, 'func_code', None) +        if not fc: +            # python 3 +            fc = f.__code__ +        pi = list(fc.co_varnames).index('path') +        def ff(*a): +            path = a[pi] +            ps = path.split('/') +            if path[0] == '/' or '..' in ps: +                raise ValueError('unsafe path') +            return f(*a) +        return ff +      @staticmethod +    @_pathguard      def entries(path):          """directory entries in an array"""          # prevent symlinks being followed @@ -219,6 +240,7 @@ class Server(object):          return os.listdir(path)      @classmethod +    @_pathguard      def purge(cls, path, entries=None):          """force-delete subtrees @@ -267,6 +289,7 @@ class Server(object):              os.rmdir(path)      @classmethod +    @_pathguard      def _create(cls, path, ctor):          """path creation backend routine"""          try: @@ -279,14 +302,17 @@ class Server(object):              raise      @classmethod +    @_pathguard      def mkdir(cls, path):          cls._create(path, os.mkdir)      @classmethod +    @_pathguard      def symlink(cls, lnk, path):          cls._create(path, lambda p: os.symlink(lnk, p))      @classmethod +    @_pathguard      def xtime(cls, path, uuid):          """query xtime extended attribute @@ -305,11 +331,13 @@ class Server(object):                  raise      @classmethod +    @_pathguard      def set_xtime(cls, path, uuid, mark):          """set @mark as xtime for @uuid on @path"""          Xattr.lsetxattr(path, '.'.join([cls.GX_NSPACE, uuid, 'xtime']), struct.pack('!II', *mark))      @staticmethod +    @_pathguard      def setattr(path, adct):          """set file attributes  | 
