diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2012-12-16 12:54:14 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2012-12-16 12:54:14 (GMT) |
commit | 39a6ee20ac5f353a6b8204864d9491deb997ef88 (patch) | |
tree | 976c0abc2e1a9edf4c55f65bd913739d8f10ef79 | |
parent | 09bc642153fc1b601909fd27d5bd728b9842fa98 (diff) | |
parent | 3c331bb729b78419da455b9f8be81b566cb7a489 (diff) | |
download | cpython-39a6ee20ac5f353a6b8204864d9491deb997ef88.zip cpython-39a6ee20ac5f353a6b8204864d9491deb997ef88.tar.gz cpython-39a6ee20ac5f353a6b8204864d9491deb997ef88.tar.bz2 |
Issue #16626: Fix infinite recursion in glob.glob() on Windows when the pattern contains a wildcard in the drive or UNC path.
Patch by Serhiy Storchaka.
-rw-r--r-- | Lib/glob.py | 5 | ||||
-rw-r--r-- | Lib/test/test_glob.py | 13 | ||||
-rw-r--r-- | Misc/NEWS | 4 |
3 files changed, 21 insertions, 1 deletions
diff --git a/Lib/glob.py b/Lib/glob.py index 3431a69..00f867f 100644 --- a/Lib/glob.py +++ b/Lib/glob.py @@ -28,7 +28,10 @@ def iglob(pathname): if not dirname: yield from glob1(None, basename) return - if has_magic(dirname): + # `os.path.split()` returns the argument itself as a dirname if it is a + # drive or UNC path. Prevent an infinite recursion if a drive or UNC path + # contains magic characters (i.e. r'\\?\C:'). + if dirname != pathname and has_magic(dirname): dirs = iglob(dirname) else: dirs = [dirname] diff --git a/Lib/test/test_glob.py b/Lib/test/test_glob.py index 806f26b..8972b8f 100644 --- a/Lib/test/test_glob.py +++ b/Lib/test/test_glob.py @@ -4,6 +4,7 @@ from test.support import (run_unittest, TESTFN, skip_unless_symlink, import glob import os import shutil +import sys class GlobTests(unittest.TestCase): @@ -110,6 +111,18 @@ class GlobTests(unittest.TestCase): eq(self.glob('sym1'), [self.norm('sym1')]) eq(self.glob('sym2'), [self.norm('sym2')]) + @unittest.skipUnless(sys.platform == "win32", "Win32 specific test") + def test_glob_magic_in_drive(self): + eq = self.assertSequencesEqual_noorder + eq(glob.glob('*:'), []) + eq(glob.glob(b'*:'), []) + eq(glob.glob('?:'), []) + eq(glob.glob(b'?:'), []) + eq(glob.glob('\\\\?\\c:\\'), ['\\\\?\\c:\\']) + eq(glob.glob(b'\\\\?\\c:\\'), [b'\\\\?\\c:\\']) + eq(glob.glob('\\\\*\\*\\'), []) + eq(glob.glob(b'\\\\*\\*\\'), []) + def test_main(): run_unittest(GlobTests) @@ -167,6 +167,10 @@ Core and Builtins Library ------- +- Issue #16626: Fix infinite recursion in glob.glob() on Windows when the + pattern contains a wildcard in the drive or UNC path. Patch by Serhiy + Storchaka. + - Issue #15783: Except for the number methods, the C version of decimal now supports all None default values present in decimal.py. These values were largely undocumented. |