mirror of
https://github.com/python/cpython.git
synced 2025-11-01 06:01:29 +00:00
bpo-38355: Fix ntpath.realpath failing on sys.executable (GH-16551)
This commit is contained in:
parent
098e25672f
commit
a0e3d27e4e
3 changed files with 15 additions and 18 deletions
|
|
@ -560,13 +560,6 @@ def _readlink_deep(path, seen=None):
|
|||
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 @@ def _getfinalpathname_nonstrict(path):
|
|||
# 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 @@ def realpath(path):
|
|||
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 @@ def realpath(path):
|
|||
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
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue