bpo-37834: Normalise handling of reparse points on Windows#15231
bpo-37834: Normalise handling of reparse points on Windows#15231zooba merged 3 commits intopython:masterfrom
Conversation
| 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; |
There was a problem hiding this comment.
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)
|
Thanks @zooba for the PR 🌮🎉.. I'm working now to backport this PR to: 3.8. |
|
Sorry, @zooba, I could not cleanly backport this to |
|
GH-15370 is a backport of this pull request to the 3.8 branch. |
…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)
…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)
…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)
https://bugs.python.org/issue37834