From 666d235ab88b98c093be51a17cf7e21f09e88bb7 Mon Sep 17 00:00:00 2001 From: Paul Sokolovsky Date: Sat, 10 May 2014 00:39:24 +0300 Subject: [PATCH] fnmatch: Fix regex undefined behavior. Per https://docs.python.org/3.4/library/re.html#regular-expression-syntax , inline flags must appear at the beginning of expression. Reported as http://bugs.python.org/issue21464 --- fnmatch/fnmatch.py | 3 ++- fnmatch/test_fnmatch.py | 16 ++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/fnmatch/fnmatch.py b/fnmatch/fnmatch.py index 1e42e0b2..d5f7a43f 100644 --- a/fnmatch/fnmatch.py +++ b/fnmatch/fnmatch.py @@ -107,4 +107,5 @@ def translate(pat): res = '%s[%s]' % (res, stuff) else: res = res + re.escape(c) - return res + '\Z(?ms)' + # Original patterns is undefined, see http://bugs.python.org/issue21464 + return '(?ms)' + res + '\Z' diff --git a/fnmatch/test_fnmatch.py b/fnmatch/test_fnmatch.py index 482835d4..06390337 100644 --- a/fnmatch/test_fnmatch.py +++ b/fnmatch/test_fnmatch.py @@ -63,14 +63,14 @@ class FnmatchTestCase(unittest.TestCase): class TranslateTestCase(unittest.TestCase): def test_translate(self): - self.assertEqual(translate('*'), '.*\Z(?ms)') - self.assertEqual(translate('?'), '.\Z(?ms)') - self.assertEqual(translate('a?b*'), 'a.b.*\Z(?ms)') - self.assertEqual(translate('[abc]'), '[abc]\Z(?ms)') - self.assertEqual(translate('[]]'), '[]]\Z(?ms)') - self.assertEqual(translate('[!x]'), '[^x]\Z(?ms)') - self.assertEqual(translate('[^x]'), '[\\^x]\Z(?ms)') - self.assertEqual(translate('[x'), '\\[x\Z(?ms)') + self.assertEqual(translate('*'), '(?ms).*\Z') + self.assertEqual(translate('?'), '(?ms).\Z') + self.assertEqual(translate('a?b*'), '(?ms)a.b.*\Z') + self.assertEqual(translate('[abc]'), '(?ms)[abc]\Z') + self.assertEqual(translate('[]]'), '(?ms)[]]\Z') + self.assertEqual(translate('[!x]'), '(?ms)[^x]\Z') + self.assertEqual(translate('[^x]'), '(?ms)[\\^x]\Z') + self.assertEqual(translate('[x'), '(?ms)\\[x\Z') class FilterTestCase(unittest.TestCase):