mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
GH-78079: Fix UNC device path root normalization in pathlib (GH-102003)
We no longer add a root to device paths such as `//./PhysicalDrive0`, `//?/BootPartition` and `//./c:` while normalizing. We also avoid adding a root to incomplete UNC share paths, like `//`, `//a` and `//a/`. Co-authored-by: Eryk Sun <eryksun@gmail.com>
This commit is contained in:
parent
7c1b0a46c6
commit
8af8f52d17
4 changed files with 43 additions and 3 deletions
|
@ -810,6 +810,9 @@ class PureWindowsPathTest(_BasePurePathTest, unittest.TestCase):
|
|||
check(('c:/a',), 'c:', '\\', ('c:\\', 'a'))
|
||||
check(('/a',), '', '\\', ('\\', 'a'))
|
||||
# UNC paths.
|
||||
check(('//',), '\\\\', '', ('\\\\',))
|
||||
check(('//a',), '\\\\a', '', ('\\\\a',))
|
||||
check(('//a/',), '\\\\a\\', '', ('\\\\a\\',))
|
||||
check(('//a/b',), '\\\\a\\b', '\\', ('\\\\a\\b\\',))
|
||||
check(('//a/b/',), '\\\\a\\b', '\\', ('\\\\a\\b\\',))
|
||||
check(('//a/b/c',), '\\\\a\\b', '\\', ('\\\\a\\b\\', 'c'))
|
||||
|
@ -823,12 +826,26 @@ class PureWindowsPathTest(_BasePurePathTest, unittest.TestCase):
|
|||
# UNC paths.
|
||||
check(('a', '//b/c//', 'd'), '\\\\b\\c', '\\', ('\\\\b\\c\\', 'd'))
|
||||
# Extended paths.
|
||||
check(('//./c:',), '\\\\.\\c:', '', ('\\\\.\\c:',))
|
||||
check(('//?/c:/',), '\\\\?\\c:', '\\', ('\\\\?\\c:\\',))
|
||||
check(('//?/c:/a',), '\\\\?\\c:', '\\', ('\\\\?\\c:\\', 'a'))
|
||||
check(('//?/c:/a', '/b'), '\\\\?\\c:', '\\', ('\\\\?\\c:\\', 'b'))
|
||||
# Extended UNC paths (format is "\\?\UNC\server\share").
|
||||
check(('//?',), '\\\\?', '', ('\\\\?',))
|
||||
check(('//?/',), '\\\\?\\', '', ('\\\\?\\',))
|
||||
check(('//?/UNC',), '\\\\?\\UNC', '', ('\\\\?\\UNC',))
|
||||
check(('//?/UNC/',), '\\\\?\\UNC\\', '', ('\\\\?\\UNC\\',))
|
||||
check(('//?/UNC/b',), '\\\\?\\UNC\\b', '', ('\\\\?\\UNC\\b',))
|
||||
check(('//?/UNC/b/',), '\\\\?\\UNC\\b\\', '', ('\\\\?\\UNC\\b\\',))
|
||||
check(('//?/UNC/b/c',), '\\\\?\\UNC\\b\\c', '\\', ('\\\\?\\UNC\\b\\c\\',))
|
||||
check(('//?/UNC/b/c/',), '\\\\?\\UNC\\b\\c', '\\', ('\\\\?\\UNC\\b\\c\\',))
|
||||
check(('//?/UNC/b/c/d',), '\\\\?\\UNC\\b\\c', '\\', ('\\\\?\\UNC\\b\\c\\', 'd'))
|
||||
# UNC device paths
|
||||
check(('//./BootPartition/',), '\\\\.\\BootPartition', '\\', ('\\\\.\\BootPartition\\',))
|
||||
check(('//?/BootPartition/',), '\\\\?\\BootPartition', '\\', ('\\\\?\\BootPartition\\',))
|
||||
check(('//./PhysicalDrive0',), '\\\\.\\PhysicalDrive0', '', ('\\\\.\\PhysicalDrive0',))
|
||||
check(('//?/Volume{}/',), '\\\\?\\Volume{}', '\\', ('\\\\?\\Volume{}\\',))
|
||||
check(('//./nul',), '\\\\.\\nul', '', ('\\\\.\\nul',))
|
||||
# Second part has a root but not drive.
|
||||
check(('a', '/b', 'c'), '', '\\', ('\\', 'b', 'c'))
|
||||
check(('Z:/a', '/b', 'c'), 'Z:', '\\', ('Z:\\', 'b', 'c'))
|
||||
|
@ -1371,6 +1388,13 @@ class PureWindowsPathTest(_BasePurePathTest, unittest.TestCase):
|
|||
self.assertEqual(pp, P('C:/a/b/dd:s'))
|
||||
pp = p.joinpath(P('E:d:s'))
|
||||
self.assertEqual(pp, P('E:d:s'))
|
||||
# Joining onto a UNC path with no root
|
||||
pp = P('//').joinpath('server')
|
||||
self.assertEqual(pp, P('//server'))
|
||||
pp = P('//server').joinpath('share')
|
||||
self.assertEqual(pp, P('//server/share'))
|
||||
pp = P('//./BootPartition').joinpath('Windows')
|
||||
self.assertEqual(pp, P('//./BootPartition/Windows'))
|
||||
|
||||
def test_div(self):
|
||||
# Basically the same as joinpath().
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue