bpo-38081: Fixes ntpath.realpath('NUL') (GH-15899)

This commit is contained in:
Steve Dower 2019-09-11 10:48:36 +01:00 committed by Zachary Ware
parent 455122a009
commit 92521fea5d
3 changed files with 12 additions and 6 deletions

View File

@ -535,9 +535,10 @@ else:
try:
path = _nt_readlink(path)
except OSError as ex:
# Stop on file (2) or directory (3) not found, or
# paths that are not reparse points (4390)
if ex.winerror in (2, 3, 4390):
# Stop on incorrect function (1), file (2) or
# directory (3) not found, or paths that are
# not reparse points (4390)
if ex.winerror in (1, 2, 3, 4390):
break
raise
except ValueError:
@ -553,9 +554,9 @@ else:
except OSError:
pass
# Allow file (2) or directory (3) not found, invalid syntax (123),
# and symlinks that cannot be followed (1921)
allowed_winerror = 2, 3, 123, 1921
# Allow file (2) or directory (3) not found, incorrect parameter (87),
# invalid syntax (123), and symlinks that cannot be followed (1921)
allowed_winerror = 2, 3, 87, 123, 1921
# Non-strict algorithm is to find as much of the target directory
# as we can and join the rest.

View File

@ -400,6 +400,10 @@ class TestNtpath(NtpathTestCase):
self.assertPathEqual(ntpath.realpath("\\\\?\\" + ABSTFN + "3.link"),
"\\\\?\\" + ABSTFN + "3.")
@unittest.skipUnless(HAVE_GETFINALPATHNAME, 'need _getfinalpathname')
def test_realpath_nul(self):
tester("ntpath.realpath('NUL')", r'\\.\NUL')
def test_expandvars(self):
with support.EnvironmentVarGuard() as env:
env.clear()

View File

@ -0,0 +1 @@
Prevent error calling :func:`os.path.realpath` on ``'NUL'``.