[Python-checkins] cpython (merge 3.3 -> default): Issue #16626: Fix infinite recursion in glob.glob() on Windows when the pattern

antoine.pitrou python-checkins at python.org
Sun Dec 16 13:56:02 CET 2012


http://hg.python.org/cpython/rev/bfb39fb93af7
changeset:   80881:bfb39fb93af7
parent:      80878:9e6cf246ca4e
parent:      80880:b90aa7f66e4a
user:        Antoine Pitrou <solipsis at pitrou.net>
date:        Sun Dec 16 13:54:14 2012 +0100
summary:
  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.

files:
  Lib/glob.py           |   5 ++++-
  Lib/test/test_glob.py |  13 +++++++++++++
  Misc/NEWS             |   4 ++++
  3 files changed, 21 insertions(+), 1 deletions(-)


diff --git a/Lib/glob.py b/Lib/glob.py
--- a/Lib/glob.py
+++ b/Lib/glob.py
@@ -28,7 +28,10 @@
     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
--- a/Lib/test/test_glob.py
+++ b/Lib/test/test_glob.py
@@ -4,6 +4,7 @@
 import glob
 import os
 import shutil
+import sys
 
 
 class GlobTests(unittest.TestCase):
@@ -110,6 +111,18 @@
         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
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -167,6 +167,10 @@
 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.

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list