]> granicus.if.org Git - python/commitdiff
Issue #16626: Fix infinite recursion in glob.glob() on Windows when the pattern conta...
authorAntoine Pitrou <solipsis@pitrou.net>
Sun, 16 Dec 2012 12:55:47 +0000 (13:55 +0100)
committerAntoine Pitrou <solipsis@pitrou.net>
Sun, 16 Dec 2012 12:55:47 +0000 (13:55 +0100)
Patch by Serhiy Storchaka.

Lib/glob.py
Lib/test/test_glob.py
Misc/NEWS

index d6ddaadc90de33d4c855ff132e5009cdf96fca3c..0aee60561faa7edea4343aae1cb657dc3736fe0b 100644 (file)
@@ -38,7 +38,10 @@ def iglob(pathname):
         for name in glob1(os.curdir, basename):
             yield name
         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]
index 285c1690c429ee3bb928b8871e8cde6678378342..fee3a60a7e61b3275c58dd2b629304c03345c016 100644 (file)
@@ -3,6 +3,7 @@ from test.test_support import run_unittest, TESTFN
 import glob
 import os
 import shutil
+import sys
 
 
 class GlobTests(unittest.TestCase):
@@ -110,6 +111,14 @@ 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(u'*:'), [])
+        eq(glob.glob('?:'), [])
+        eq(glob.glob(u'?:'), [])
+
 
 def test_main():
     run_unittest(GlobTests)
index 44b9b06676bd90c939d6805decdb19057f0b0ba0..605a7a8f0fb9fe22592a2b7575a2d44a4a66ddd5 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -160,6 +160,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 #16298: In HTTPResponse.read(), close the socket when there is no
   Content-Length and the incoming stream is finished.  Patch by Eran
   Rundstein.