summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2012-12-16 12:54:14 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2012-12-16 12:54:14 (GMT)
commit39a6ee20ac5f353a6b8204864d9491deb997ef88 (patch)
tree976c0abc2e1a9edf4c55f65bd913739d8f10ef79
parent09bc642153fc1b601909fd27d5bd728b9842fa98 (diff)
parent3c331bb729b78419da455b9f8be81b566cb7a489 (diff)
downloadcpython-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.py5
-rw-r--r--Lib/test/test_glob.py13
-rw-r--r--Misc/NEWS4
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)
diff --git a/Misc/NEWS b/Misc/NEWS
index 6be851e..fcbfb9f 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.