Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bpo-37834: Normalise handling of reparse points on Windows #15231

Merged
merged 3 commits into from
Aug 21, 2019

Conversation

zooba
Copy link
Member

@zooba zooba commented Aug 12, 2019

@zooba zooba added type-bug An unexpected behavior, bug, or error OS-windows needs backport to 3.8 labels Aug 12, 2019
@zooba zooba changed the title bpo-37834: Enable os.readlink and os.path.is_link to recognize app execution aliases bpo-37834: Only treat symlink and junction reparse points as links Aug 13, 2019
Python/fileutils.c Outdated Show resolved Hide resolved
if (PyModule_AddObject(m, "IO_REPARSE_TAG_MOUNT_POINT",
PyLong_FromUnsignedLong(IO_REPARSE_TAG_MOUNT_POINT))) return NULL;
if (PyModule_AddObject(m, "IO_REPARSE_TAG_APPEXECLINK",
PyLong_FromUnsignedLong(IO_REPARSE_TAG_APPEXECLINK))) return NULL;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IO_REPARSE_TAG_UNHANDLED (0x80000020), going by its name, is always an unhandled tag. IO_REPARSE_TAG_LX_SYMLINK (0xA000001D) should be an unhandled link tag, since it's used for symlinks between an NT file system and a WSL file system (e.g. "/mnt/c/etc" -> "/etc").

I looked over Microsoft's tags for a handled tag that's not a link, but nothing stands out. I thought that OneDrive used them (i.e. IO_REPARSE_TAG_CLOUD*), but that doesn't appear to be the case anymore. I also thought the new Projected File System support would use them (i.e. IO_REPARSE_TAG_PROJFS). I built the RegFS sample to try to confirm this, and I was surprised to find that none of the virtual directories and files (keys and values) was a reparse point.

However, both OneDrive and ProjFS do make extensive use of the following new file attributes:

FILE_ATTRIBUTE_PINNED  0x00080000
FILE_ATTRIBUTE_UNPINNED  0x00100000
FILE_ATTRIBUTE_RECALL_ON_OPEN  0x00040000
FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS  0x00400000

* ntpath.realpath() and nt.stat() will traverse all supported reparse points (previously was mixed)
* nt.lstat() will let the OS traverse reparse points that are not name surrogates (previously would not traverse any reparse point)
* nt.[l]stat() will only set S_IFLNK for symlinks (previous behaviour)
* nt.readlink() will read destinations for symlinks and junction points only

bpo-1311: os.path.exists('nul') now returns True on Windows
* nt.stat('nul').st_mode is now S_IFCHR (previously was an error)
@zooba zooba changed the title bpo-37834: Only treat symlink and junction reparse points as links bpo-37834: Normalise handling of reparse points on Windows Aug 21, 2019
@zooba zooba merged commit df2d4a6 into python:master Aug 21, 2019
@zooba zooba deleted the bpo-37834 branch August 21, 2019 22:27
@miss-islington
Copy link
Contributor

Thanks @zooba for the PR 🌮🎉.. I'm working now to backport this PR to: 3.8.
🐍🍒⛏🤖

@miss-islington
Copy link
Contributor

Sorry, @zooba, I could not cleanly backport this to 3.8 due to a conflict.
Please backport using cherry_picker on command line.
cherry_picker df2d4a6f3d5da2839c4fc11d31511c8e028daf2c 3.8

@bedevere-bot
Copy link

GH-15370 is a backport of this pull request to the 3.8 branch.

lisroach pushed a commit to lisroach/cpython that referenced this pull request Sep 10, 2019
…15231)

bpo-37834: Normalise handling of reparse points on Windows
* ntpath.realpath() and nt.stat() will traverse all supported reparse points (previously was mixed)
* nt.lstat() will let the OS traverse reparse points that are not name surrogates (previously would not traverse any reparse point)
* nt.[l]stat() will only set S_IFLNK for symlinks (previous behaviour)
* nt.readlink() will read destinations for symlinks and junction points only

bpo-1311: os.path.exists('nul') now returns True on Windows
* nt.stat('nul').st_mode is now S_IFCHR (previously was an error)
DinoV pushed a commit to DinoV/cpython that referenced this pull request Jan 14, 2020
…15231)

bpo-37834: Normalise handling of reparse points on Windows
* ntpath.realpath() and nt.stat() will traverse all supported reparse points (previously was mixed)
* nt.lstat() will let the OS traverse reparse points that are not name surrogates (previously would not traverse any reparse point)
* nt.[l]stat() will only set S_IFLNK for symlinks (previous behaviour)
* nt.readlink() will read destinations for symlinks and junction points only

bpo-1311: os.path.exists('nul') now returns True on Windows
* nt.stat('nul').st_mode is now S_IFCHR (previously was an error)
websurfer5 pushed a commit to websurfer5/cpython that referenced this pull request Jul 20, 2020
…15231)

bpo-37834: Normalise handling of reparse points on Windows
* ntpath.realpath() and nt.stat() will traverse all supported reparse points (previously was mixed)
* nt.lstat() will let the OS traverse reparse points that are not name surrogates (previously would not traverse any reparse point)
* nt.[l]stat() will only set S_IFLNK for symlinks (previous behaviour)
* nt.readlink() will read destinations for symlinks and junction points only

bpo-1311: os.path.exists('nul') now returns True on Windows
* nt.stat('nul').st_mode is now S_IFCHR (previously was an error)
maxbachmann added a commit to maxbachmann/cpython that referenced this pull request Feb 21, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
OS-windows type-bug An unexpected behavior, bug, or error
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants