[Python-checkins] cpython (2.7): Issue #16975: Fix error handling bug in the escape-decode decoder.

serhiy.storchaka python-checkins at python.org
Fri Jan 25 22:43:56 CET 2013


http://hg.python.org/cpython/rev/5970c90dd8d1
changeset: 81737:5970c90dd8d1
branch: 2.7
parent: 81729:864b9836dae6
user: Serhiy Storchaka <storchaka at gmail.com>
date: Fri Jan 25 23:30:50 2013 +0200
summary:
 Issue #16975: Fix error handling bug in the escape-decode decoder.
files:
 Lib/test/test_codecs.py | 44 +++++++++++++++++++++++++++++
 Misc/NEWS | 2 +
 Objects/stringobject.c | 4 ++
 3 files changed, 50 insertions(+), 0 deletions(-)
diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py
--- a/Lib/test/test_codecs.py
+++ b/Lib/test/test_codecs.py
@@ -730,6 +730,50 @@
 def test_empty(self):
 self.assertEqual(codecs.escape_decode(""), ("", 0))
 
+ def test_raw(self):
+ for b in ''.join(map(chr, range(256))):
+ if b != '\\':
+ self.assertEqual(codecs.escape_decode(b + '0'),
+ (b + '0', 2))
+
+ def test_escape(self):
+ self.assertEqual(codecs.escape_decode(b"[\\\n]"), (b"[]", 4))
+ self.assertEqual(codecs.escape_decode(br'[\"]'), (b'["]', 4))
+ self.assertEqual(codecs.escape_decode(br"[\']"), (b"[']", 4))
+ self.assertEqual(codecs.escape_decode(br"[\\]"), (br"[\]", 4))
+ self.assertEqual(codecs.escape_decode(br"[\a]"), (b"[\x07]", 4))
+ self.assertEqual(codecs.escape_decode(br"[\b]"), (b"[\x08]", 4))
+ self.assertEqual(codecs.escape_decode(br"[\t]"), (b"[\x09]", 4))
+ self.assertEqual(codecs.escape_decode(br"[\n]"), (b"[\x0a]", 4))
+ self.assertEqual(codecs.escape_decode(br"[\v]"), (b"[\x0b]", 4))
+ self.assertEqual(codecs.escape_decode(br"[\f]"), (b"[\x0c]", 4))
+ self.assertEqual(codecs.escape_decode(br"[\r]"), (b"[\x0d]", 4))
+ self.assertEqual(codecs.escape_decode(br"[7円]"), (b"[\x07]", 4))
+ self.assertEqual(codecs.escape_decode(br"[8円]"), (br"[8円]", 4))
+ self.assertEqual(codecs.escape_decode(br"[78円]"), (b"[\x078]", 5))
+ self.assertEqual(codecs.escape_decode(br"[41円]"), (b"[!]", 5))
+ self.assertEqual(codecs.escape_decode(br"[418円]"), (b"[!8]", 6))
+ self.assertEqual(codecs.escape_decode(br"[101円]"), (b"[A]", 6))
+ self.assertEqual(codecs.escape_decode(br"[1010円]"), (b"[A0]", 7))
+ self.assertEqual(codecs.escape_decode(br"[501円]"), (b"[A]", 6))
+ self.assertEqual(codecs.escape_decode(br"[\x41]"), (b"[A]", 6))
+ self.assertEqual(codecs.escape_decode(br"[\X41]"), (br"[\X41]", 6))
+ self.assertEqual(codecs.escape_decode(br"[\x410]"), (b"[A0]", 7))
+ for b in ''.join(map(chr, range(256))):
+ if b not in '\n"\'\\abtnvfr01234567x':
+ self.assertEqual(codecs.escape_decode('\\' + b),
+ ('\\' + b, 2))
+
+ def test_errors(self):
+ self.assertRaises(ValueError, codecs.escape_decode, br"\x")
+ self.assertRaises(ValueError, codecs.escape_decode, br"[\x]")
+ self.assertEqual(codecs.escape_decode(br"[\x]\x", "ignore"), (b"[]", 6))
+ self.assertEqual(codecs.escape_decode(br"[\x]\x", "replace"), (b"[?]?", 6))
+ self.assertRaises(ValueError, codecs.escape_decode, br"\x0")
+ self.assertRaises(ValueError, codecs.escape_decode, br"[\x0]")
+ self.assertEqual(codecs.escape_decode(br"[\x0]\x0", "ignore"), (b"[]", 8))
+ self.assertEqual(codecs.escape_decode(br"[\x0]\x0", "replace"), (b"[?]?", 8))
+
 class RecodingTest(unittest.TestCase):
 def test_recoding(self):
 f = StringIO.StringIO()
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -9,6 +9,8 @@
 Core and Builtins
 -----------------
 
+- Issue #16975: Fix error handling bug in the escape-decode decoder.
+
 - Issue #14850: Now a charmap decoder treats U+FFFE as "undefined mapping"
 in any mapping, not only in a Unicode string.
 
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -726,6 +726,10 @@
 errors);
 goto failed;
 }
+ /* skip \x */
+ if (s < end && isxdigit(Py_CHARMASK(s[0])))
+ s++; /* and a hexdigit */
+ break;
 #ifndef Py_USING_UNICODE
 case 'u':
 case 'U':
-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /