Repository navigation
[pathlib] issues with Windows device paths #78079
Description
Activity
For \\?\ extended device paths, pathlib removes the trailing slash for the root directory if the device isn't UNC or a logical (A-Z) drive.
Correct:
>>> str(Path('//?/UNC/')) '\\\\?\\UNC\\' >>> str(Path('//?/Z:/')) '\\\\?\\Z:\\'Incorrect:
>>> str(Path('//?/BootPartition/')) '\\\\?\\BootPartition' >>> str(Path('//?/Volume{}/')) '\\\\?\\Volume{}' >>> str(Path('//?/Global/Z:/')) '\\\\?\\Global\\Z:'It keeps the trailing slash for some \\.\ paths, but not all.
Correct:
>>> str(Path('//./BootPartition/')) '\\\\.\\BootPartition\\'Incorrect:
>>> str(Path('//./Global/Z:/')) '\\\\.\\Global\\Z:'It adds a root directory to \\.\ device paths where none was specified.
Incorrect:
>>> str(Path('//./nul')) '\\\\.\\nul\\' >>> str(Path('//./PhysicalDrive0')) '\\\\.\\PhysicalDrive0\\' >>> str(Path('//./C:')) '\\\\.\\C:\\'"\\\\.\\C:" refers to the volume device, whereas "\\\\.\\C:\\" is the root directory in the file system.
pathlib should parse \\?\ and \\.\ device paths the same way with respect to the drive and root. The difference in practice is only how Windows does (\\.\) or does not (\\?\) canonicalize the path.
Additionally, pathlib fails to identify the drive correctly in these cases.
Incorrect:
>>> Path('//?/Global/Z:/').drive '\\\\?\\' >>> Path('//?/BootPartition/Temp').drive '\\\\?\\'Except for "UNC" and "Global" paths, the drive should be the first component after the local-device prefix. The "UNC" device also includes subsequent server and share components, if any. For the reserved "Global" symlink, it should look to the next component. For example, r'\\?\Global\UNC\server\share' is a drive.
There's also the "GlobalRoot" symlink (or "Global\\GlobalRoot" to be pedantic), but that can't be handled generically.
- added3.7 (EOL)end of lifeend of life3.8 (EOL)end of lifeend of lifestdlibStandard Library Python modules in the Lib/ directoryStandard Library Python modules in the Lib/ directorytype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
on Jun 18, 2018 Eryk - I've got the PR ready as far as I'm concerned. Have you had a look to see if you're happy with its logic for these cases?
- changed the title
[-]pathlib issues with Windows device paths[/-][+][pathlib] issues with Windows device paths[/+]on Aug 8, 2022 I think this is the issue that requires
splitrootto be correct (which it might be by now?) and thenpathlibhas to be very deliberate about the meaning of a trailing slash in the drive part vs a leading slash in the rest of the path.The current PR doesn't seem to be easily resolvable, but is probably well out of date anyway because of other work that's been done in pathlib and ntpath.
The existing test suite and the examples Eryk posted above are probably the best way to figure out the right semantics.
Based on Eryk's test cases,
ntpath.splitroot()gets//?/Globaland//./Globalpaths wrong:>>> ntpath.splitroot('//./Global/Z:/') ('//./Global', '/', 'Z:/') >>> ntpath.splitroot('//?/Global/Z:/') ('//?/Global', '/', 'Z:/')
I believe that all the other failing test cases can be put down to pathlib erroneously adding roots to paths like
//./C:,//./nul,//./PhysicalDrive0and//?/UNC/.I believe that all the other failing test cases can be put down to pathlib erroneously adding roots to paths
Yeah, this is what I expected with "deliberate about the meaning of ... leading slash in the rest of the path". I know we've encountered these consistency issues before, but I don't know whether they were all resolved.
2 remaining items
- added a commit that references this issue
on Feb 17, 2023 I've opened a PR that fixes all of Eryk's test cases except
//./Globaland//?/Global: #102003- added a commit that references this issue
on Feb 20, 2023 - added a commit that references this issue
on Mar 10, 2023 - added a commit that references this issue
on Mar 21, 2023 - added 4 commits that reference this issue
on Apr 3, 2023 Hey @eryksun, do you think we should leave this issue open to cover the remaining "Global" and "GLOBALROOT" issues? The problem there lies mostly in
ntpath.splitroot(), so I might remove theexpert-pathliblabel, or even create a new issue.- added 2 commits that reference this issue
on Apr 17, 2023 I vote for a new issue (with a more descriptive title), and would also say it's not a high priority. If you can describe it well enough, might even be able to justify tagging it "easy" and offer it up for someone at sprints.
Logged here:
I don't understand the rules for "Global" and "GLOBALROOT" so it's not very well described :)
Resolving this issue! Thanks all.
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
Linked PRs