e2726f1
diff -up pyxdg-0.25/xdg/BaseDirectory.py.CVE-2014-1624 pyxdg-0.25/xdg/BaseDirectory.py
e2726f1
--- pyxdg-0.25/xdg/BaseDirectory.py.CVE-2014-1624	2014-12-04 11:49:53.681654931 -0500
e2726f1
+++ pyxdg-0.25/xdg/BaseDirectory.py	2014-12-04 11:52:45.831522703 -0500
e2726f1
@@ -25,7 +25,7 @@ Typical usage:
e2726f1
 Note: see the rox.Options module for a higher-level API for managing options.
e2726f1
 """
e2726f1
 
e2726f1
-import os
e2726f1
+import os, stat
e2726f1
 
e2726f1
 _home = os.path.expanduser('~')
e2726f1
 xdg_data_home = os.environ.get('XDG_DATA_HOME') or \
e2726f1
@@ -131,15 +131,29 @@ def get_runtime_dir(strict=True):
e2726f1
         
e2726f1
         import getpass
e2726f1
         fallback = '/tmp/pyxdg-runtime-dir-fallback-' + getpass.getuser()
e2726f1
+        create = False
e2726f1
         try:
e2726f1
-            os.mkdir(fallback, 0o700)
e2726f1
+            # This must be a real directory, not a symlink, so attackers can't
e2726f1
+            # point it elsewhere. So we use lstat to check it.
e2726f1
+            st = os.lstat(fallback)
e2726f1
         except OSError as e:
e2726f1
             import errno
e2726f1
-            if e.errno == errno.EEXIST:
e2726f1
-                # Already exists - set 700 permissions again.
e2726f1
-                import stat
e2726f1
-                os.chmod(fallback, stat.S_IRUSR|stat.S_IWUSR|stat.S_IXUSR)
e2726f1
-            else: # pragma: no cover
e2726f1
+            if e.errno == errno.ENOENT:
e2726f1
+                create = True
e2726f1
+            else:
e2726f1
                 raise
e2726f1
+        else:
e2726f1
+            # The fallback must be a directory
e2726f1
+            if not stat.S_ISDIR(st.st_mode):
e2726f1
+                os.unlink(fallback)
e2726f1
+                create = True
e2726f1
+            # Must be owned by the user and not accessible by anyone else
e2726f1
+            elif (st.st_uid != os.getuid()) \
e2726f1
+              or (st.st_mode & (stat.S_IRWXG | stat.S_IRWXO)):
e2726f1
+                os.rmdir(fallback)
e2726f1
+                create = True
e2726f1
+
e2726f1
+        if create:
e2726f1
+            os.mkdir(fallback, 0o700)
e2726f1
         
e2726f1
         return fallback