From a0e3d27e4e3cb5b67e325df080fb18b70c2910cf Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Thu, 3 Oct 2019 08:31:03 -0700 Subject: bpo-38355: Fix ntpath.realpath failing on sys.executable (GH-16551) --- Lib/ntpath.py | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) (limited to 'Lib/ntpath.py') diff --git a/Lib/ntpath.py b/Lib/ntpath.py index 01f1f423c9..d4ecff97c9 100644 --- a/Lib/ntpath.py +++ b/Lib/ntpath.py @@ -560,13 +560,6 @@ else: return path def _getfinalpathname_nonstrict(path): - # Fast path to get the final path name. If this succeeds, there - # is no need to go any further. - try: - return _getfinalpathname(path) - except OSError: - pass - # These error codes indicate that we should stop resolving the path # and return the value we currently have. # 1: ERROR_INVALID_FUNCTION @@ -579,8 +572,9 @@ else: # 67: ERROR_BAD_NET_NAME (implies remote server unavailable) # 87: ERROR_INVALID_PARAMETER # 123: ERROR_INVALID_NAME + # 1920: ERROR_CANT_ACCESS_FILE # 1921: ERROR_CANT_RESOLVE_FILENAME (implies unfollowable symlink) - allowed_winerror = 1, 2, 3, 5, 21, 32, 50, 67, 87, 123, 1921 + allowed_winerror = 1, 2, 3, 5, 21, 32, 50, 67, 87, 123, 1920, 1921 # Non-strict algorithm is to find as much of the target directory # as we can and join the rest. @@ -615,9 +609,13 @@ else: unc_prefix = '\\\\?\\UNC\\' new_unc_prefix = '\\\\' cwd = os.getcwd() - did_not_exist = not exists(path) had_prefix = path.startswith(prefix) - path = _getfinalpathname_nonstrict(path) + try: + path = _getfinalpathname(path) + initial_winerror = 0 + except OSError as ex: + initial_winerror = ex.winerror + path = _getfinalpathname_nonstrict(path) # The path returned by _getfinalpathname will always start with \\?\ - # strip off that prefix unless it was already provided on the original # path. @@ -635,7 +633,7 @@ else: except OSError as ex: # If the path does not exist and originally did not exist, then # strip the prefix anyway. - if ex.winerror in {2, 3} and did_not_exist: + if ex.winerror == initial_winerror: path = spath return path -- cgit v1.2.1