mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	Issue #23146: Fix mishandling of absolute Windows paths with forward slashes in pathlib.
Detected and fixed by Serhiy.
This commit is contained in:
		
							parent
							
								
									0aa74e10bb
								
							
						
					
					
						commit
						57fffd6f99
					
				
					 3 changed files with 27 additions and 16 deletions
				
			
		|  | @ -73,6 +73,10 @@ def parse_parts(self, parts): | ||||||
|                     # parts. This makes the result of parsing e.g. |                     # parts. This makes the result of parsing e.g. | ||||||
|                     # ("C:", "/", "a") reasonably intuitive. |                     # ("C:", "/", "a") reasonably intuitive. | ||||||
|                     for part in it: |                     for part in it: | ||||||
|  |                         if not part: | ||||||
|  |                             continue | ||||||
|  |                         if altsep: | ||||||
|  |                             part = part.replace(altsep, sep) | ||||||
|                         drv = self.splitroot(part)[0] |                         drv = self.splitroot(part)[0] | ||||||
|                         if drv: |                         if drv: | ||||||
|                             break |                             break | ||||||
|  |  | ||||||
|  | @ -105,31 +105,35 @@ def test_parse_parts(self): | ||||||
|         check = self._check_parse_parts |         check = self._check_parse_parts | ||||||
|         # First part is anchored |         # First part is anchored | ||||||
|         check(['c:'],                   ('c:', '', ['c:'])) |         check(['c:'],                   ('c:', '', ['c:'])) | ||||||
|         check(['c:\\'],                 ('c:', '\\', ['c:\\'])) |         check(['c:/'],                  ('c:', '\\', ['c:\\'])) | ||||||
|         check(['\\'],                   ('', '\\', ['\\'])) |         check(['/'],                    ('', '\\', ['\\'])) | ||||||
|         check(['c:a'],                  ('c:', '', ['c:', 'a'])) |         check(['c:a'],                  ('c:', '', ['c:', 'a'])) | ||||||
|         check(['c:\\a'],                ('c:', '\\', ['c:\\', 'a'])) |         check(['c:/a'],                 ('c:', '\\', ['c:\\', 'a'])) | ||||||
|         check(['\\a'],                  ('', '\\', ['\\', 'a'])) |         check(['/a'],                   ('', '\\', ['\\', 'a'])) | ||||||
|         # UNC paths |         # UNC paths | ||||||
|         check(['\\\\a\\b'],             ('\\\\a\\b', '\\', ['\\\\a\\b\\'])) |         check(['//a/b'],                ('\\\\a\\b', '\\', ['\\\\a\\b\\'])) | ||||||
|         check(['\\\\a\\b\\'],           ('\\\\a\\b', '\\', ['\\\\a\\b\\'])) |         check(['//a/b/'],               ('\\\\a\\b', '\\', ['\\\\a\\b\\'])) | ||||||
|         check(['\\\\a\\b\\c'],          ('\\\\a\\b', '\\', ['\\\\a\\b\\', 'c'])) |         check(['//a/b/c'],              ('\\\\a\\b', '\\', ['\\\\a\\b\\', 'c'])) | ||||||
|         # Second part is anchored, so that the first part is ignored |         # Second part is anchored, so that the first part is ignored | ||||||
|         check(['a', 'Z:b', 'c'],        ('Z:', '', ['Z:', 'b', 'c'])) |         check(['a', 'Z:b', 'c'],        ('Z:', '', ['Z:', 'b', 'c'])) | ||||||
|         check(['a', 'Z:\\b', 'c'],      ('Z:', '\\', ['Z:\\', 'b', 'c'])) |         check(['a', 'Z:/b', 'c'],       ('Z:', '\\', ['Z:\\', 'b', 'c'])) | ||||||
|         check(['a', '\\b', 'c'],        ('', '\\', ['\\', 'b', 'c'])) |  | ||||||
|         # UNC paths |         # UNC paths | ||||||
|         check(['a', '\\\\b\\c', 'd'],   ('\\\\b\\c', '\\', ['\\\\b\\c\\', 'd'])) |         check(['a', '//b/c', 'd'],      ('\\\\b\\c', '\\', ['\\\\b\\c\\', 'd'])) | ||||||
|         # Collapsing and stripping excess slashes |         # Collapsing and stripping excess slashes | ||||||
|         check(['a', 'Z:\\\\b\\\\c\\', 'd\\'], ('Z:', '\\', ['Z:\\', 'b', 'c', 'd'])) |         check(['a', 'Z://b//c/', 'd/'], ('Z:', '\\', ['Z:\\', 'b', 'c', 'd'])) | ||||||
|         # UNC paths |         # UNC paths | ||||||
|         check(['a', '\\\\b\\c\\\\', 'd'], ('\\\\b\\c', '\\', ['\\\\b\\c\\', 'd'])) |         check(['a', '//b/c//', 'd'],    ('\\\\b\\c', '\\', ['\\\\b\\c\\', 'd'])) | ||||||
|         # Extended paths |         # Extended paths | ||||||
|         check(['\\\\?\\c:\\'],          ('\\\\?\\c:', '\\', ['\\\\?\\c:\\'])) |         check(['//?/c:/'],              ('\\\\?\\c:', '\\', ['\\\\?\\c:\\'])) | ||||||
|         check(['\\\\?\\c:\\a'],         ('\\\\?\\c:', '\\', ['\\\\?\\c:\\', 'a'])) |         check(['//?/c:/a'],             ('\\\\?\\c:', '\\', ['\\\\?\\c:\\', 'a'])) | ||||||
|  |         check(['//?/c:/a', '/b'],       ('\\\\?\\c:', '\\', ['\\\\?\\c:\\', 'b'])) | ||||||
|         # Extended UNC paths (format is "\\?\UNC\server\share") |         # Extended UNC paths (format is "\\?\UNC\server\share") | ||||||
|         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'])) |         check(['//?/UNC/b/c/d'],        ('\\\\?\\UNC\\b\\c', '\\', ['\\\\?\\UNC\\b\\c\\', 'd'])) | ||||||
|  |         # Second part has a root but not drive | ||||||
|  |         check(['a', '/b', 'c'],         ('', '\\', ['\\', 'b', 'c'])) | ||||||
|  |         check(['Z:/a', '/b', 'c'],      ('Z:', '\\', ['Z:\\', 'b', 'c'])) | ||||||
|  |         check(['//?/Z:/a', '/b', 'c'],  ('\\\\?\\Z:', '\\', ['\\\\?\\Z:\\', 'b', 'c'])) | ||||||
| 
 | 
 | ||||||
|     def test_splitroot(self): |     def test_splitroot(self): | ||||||
|         f = self.flavour.splitroot |         f = self.flavour.splitroot | ||||||
|  |  | ||||||
|  | @ -13,6 +13,9 @@ Core and Builtins | ||||||
| Library | Library | ||||||
| ------- | ------- | ||||||
| 
 | 
 | ||||||
|  | - Issue #23146: Fix mishandling of absolute Windows paths with forward | ||||||
|  |   slashes in pathlib. | ||||||
|  | 
 | ||||||
| - Issue #23421: Fixed compression in tarfile CLI.  Patch by wdv4758h. | - Issue #23421: Fixed compression in tarfile CLI.  Patch by wdv4758h. | ||||||
| 
 | 
 | ||||||
| - Issue #23361: Fix possible overflow in Windows subprocess creation code. | - Issue #23361: Fix possible overflow in Windows subprocess creation code. | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Antoine Pitrou
						Antoine Pitrou