]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-31047: Fix ntpath.abspath for invalid paths (GH-8544)
authorSteve Dower <steve.dower@microsoft.com>
Tue, 7 Aug 2018 00:08:39 +0000 (01:08 +0100)
committerGitHub <noreply@github.com>
Tue, 7 Aug 2018 00:08:39 +0000 (01:08 +0100)
Lib/ntpath.py
Lib/test/test_ntpath.py
Misc/NEWS.d/next/Library/2018-07-29-14-12-23.bpo-31047.FSarLs.rst [new file with mode: 0644]

index a5e79ba66371f89f44b41cddee2455fd16e77572..24113e701d1152a72c370bcb9bb7961fdcf58cbf 100644 (file)
@@ -518,38 +518,36 @@ def normpath(path):
         comps.append(curdir)
     return prefix + sep.join(comps)
 
+def _abspath_fallback(path):
+    """Return the absolute version of a path as a fallback function in case
+    `nt._getfullpathname` is not available or raises OSError. See bpo-31047 for
+    more.
+
+    """
+
+    path = os.fspath(path)
+    if not isabs(path):
+        if isinstance(path, bytes):
+            cwd = os.getcwdb()
+        else:
+            cwd = os.getcwd()
+        path = join(cwd, path)
+    return normpath(path)
 
 # Return an absolute path.
 try:
     from nt import _getfullpathname
 
 except ImportError: # not running on Windows - mock up something sensible
-    def abspath(path):
-        """Return the absolute version of a path."""
-        path = os.fspath(path)
-        if not isabs(path):
-            if isinstance(path, bytes):
-                cwd = os.getcwdb()
-            else:
-                cwd = os.getcwd()
-            path = join(cwd, path)
-        return normpath(path)
+    abspath = _abspath_fallback
 
 else:  # use native Windows method on Windows
     def abspath(path):
         """Return the absolute version of a path."""
-
-        if path: # Empty path must return current working directory.
-            path = os.fspath(path)
-            try:
-                path = _getfullpathname(path)
-            except OSError:
-                pass # Bad path - return unchanged.
-        elif isinstance(path, bytes):
-            path = os.getcwdb()
-        else:
-            path = os.getcwd()
-        return normpath(path)
+        try:
+            return _getfullpathname(path)
+        except OSError:
+            return _abspath_fallback(path)
 
 # realpath is a no-op on systems without islink support
 realpath = abspath
index 40761843f34ca32874961fd3f523dcc8e07a0b44..f93d902d32fa93330bbb331b8468ba427bccfdb7 100644 (file)
@@ -303,6 +303,10 @@ class TestNtpath(unittest.TestCase):
         try:
             import nt
             tester('ntpath.abspath("C:\\")', "C:\\")
+            with support.temp_cwd(support.TESTFN) as cwd_dir: # bpo-31047
+                tester('ntpath.abspath("")', cwd_dir)
+                tester('ntpath.abspath(" ")', cwd_dir + "\\ ")
+                tester('ntpath.abspath("?")', cwd_dir + "\\?")
         except ImportError:
             self.skipTest('nt module not available')
 
diff --git a/Misc/NEWS.d/next/Library/2018-07-29-14-12-23.bpo-31047.FSarLs.rst b/Misc/NEWS.d/next/Library/2018-07-29-14-12-23.bpo-31047.FSarLs.rst
new file mode 100644 (file)
index 0000000..6415d4a
--- /dev/null
@@ -0,0 +1,2 @@
+Fix ``ntpath.abspath`` for invalid paths on windows. Patch by Franz
+Woellert.