From cc9413f42a26fa1992003f51bf02a2c6ca2ccea9 Mon Sep 17 00:00:00 2001 From: "antoine.pitrou" Date: Fri, 15 Aug 2008 21:03:21 +0000 Subject: [PATCH] #2676: email/message.py [Message.get_content_type]: Trivial regex hangs on pathological input git-svn-id: http://svn.python.org/projects/python/trunk@65700 6015fed2-1504-0410-9fe1-9d1591cc4771 --- Lib/email/message.py | 18 +++++++++++------- Misc/NEWS | 4 ++++ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/Lib/email/message.py b/Lib/email/message.py index 287232be04..e44217b2b0 100644 --- a/Lib/email/message.py +++ b/Lib/email/message.py @@ -19,18 +19,22 @@ from email import errors SEMISPACE = '; ' -# Regular expression used to split header parameters. BAW: this may be too -# simple. It isn't strictly RFC 2045 (section 5.1) compliant, but it catches -# most headers found in the wild. We may eventually need a full fledged -# parser eventually. -paramre = re.compile(r'\s*;\s*') # Regular expression that matches `special' characters in parameters, the # existance of which force quoting of the parameter value. tspecials = re.compile(r'[ \(\)<>@,;:\\"/\[\]\?=]') - # Helper functions +def _splitparam(param): + # Split header parameters. BAW: this may be too simple. It isn't + # strictly RFC 2045 (section 5.1) compliant, but it catches most headers + # found in the wild. We may eventually need a full fledged parser + # eventually. + a, sep, b = param.partition(';') + if not sep: + return a.strip(), None + return a.strip(), b.strip() + def _formatparam(param, value=None, quote=True): """Convenience function to format and return a key=value pair. @@ -436,7 +440,7 @@ class Message: if value is missing: # This should have no parameters return self.get_default_type() - ctype = paramre.split(value)[0].lower().strip() + ctype = _splitparam(value)[0].lower() # RFC 2045, section 5.2 says if its invalid, use text/plain if ctype.count('/') != 1: return 'text/plain' diff --git a/Misc/NEWS b/Misc/NEWS index 70a06ffb16..de572d1f38 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -48,6 +48,10 @@ Core and Builtins Library ------- +- Issue #2676: in the email package, content-type parsing was hanging on + pathological input because of quadratic or exponential behaviour of a + regular expression. + - Issue #3476: binary buffered reading through the new "io" library is now thread-safe. -- 2.11.4.GIT