Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e58785b

Browse files
Issue #16975: Fix error handling bug in the escape-decode bytes decoder.
2 parents a10e4a9 + ace3ad3 commit e58785b

3 files changed

Lines changed: 50 additions & 0 deletions

File tree

Lib/test/test_codecs.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -927,6 +927,50 @@ class EscapeDecodeTest(unittest.TestCase):
927927
def test_empty(self):
928928
self.assertEqual(codecs.escape_decode(""), (b"", 0))
929929

930+
def test_raw(self):
931+
for b in range(256):
932+
if b != b'\\'[0]:
933+
self.assertEqual(codecs.escape_decode(bytes([b]) + b'0'),
934+
(bytes([b]) + b'0', 2))
935+
936+
def test_escape(self):
937+
self.assertEqual(codecs.escape_decode(b"[\\\n]"), (b"[]", 4))
938+
self.assertEqual(codecs.escape_decode(br'[\"]'), (b'["]', 4))
939+
self.assertEqual(codecs.escape_decode(br"[\']"), (b"[']", 4))
940+
self.assertEqual(codecs.escape_decode(br"[\\]"), (br"[\]", 4))
941+
self.assertEqual(codecs.escape_decode(br"[\a]"), (b"[\x07]", 4))
942+
self.assertEqual(codecs.escape_decode(br"[\b]"), (b"[\x08]", 4))
943+
self.assertEqual(codecs.escape_decode(br"[\t]"), (b"[\x09]", 4))
944+
self.assertEqual(codecs.escape_decode(br"[\n]"), (b"[\x0a]", 4))
945+
self.assertEqual(codecs.escape_decode(br"[\v]"), (b"[\x0b]", 4))
946+
self.assertEqual(codecs.escape_decode(br"[\f]"), (b"[\x0c]", 4))
947+
self.assertEqual(codecs.escape_decode(br"[\r]"), (b"[\x0d]", 4))
948+
self.assertEqual(codecs.escape_decode(br"[\7]"), (b"[\x07]", 4))
949+
self.assertEqual(codecs.escape_decode(br"[\8]"), (br"[\8]", 4))
950+
self.assertEqual(codecs.escape_decode(br"[\78]"), (b"[\x078]", 5))
951+
self.assertEqual(codecs.escape_decode(br"[\41]"), (b"[!]", 5))
952+
self.assertEqual(codecs.escape_decode(br"[\418]"), (b"[!8]", 6))
953+
self.assertEqual(codecs.escape_decode(br"[\101]"), (b"[A]", 6))
954+
self.assertEqual(codecs.escape_decode(br"[\1010]"), (b"[A0]", 7))
955+
self.assertEqual(codecs.escape_decode(br"[\501]"), (b"[A]", 6))
956+
self.assertEqual(codecs.escape_decode(br"[\x41]"), (b"[A]", 6))
957+
self.assertEqual(codecs.escape_decode(br"[\X41]"), (br"[\X41]", 6))
958+
self.assertEqual(codecs.escape_decode(br"[\x410]"), (b"[A0]", 7))
959+
for b in range(256):
960+
if b not in b'\n"\'\\abtnvfr01234567x':
961+
self.assertEqual(codecs.escape_decode(b'\\' + bytes([b])),
962+
(b'\\' + bytes([b]), 2))
963+
964+
def test_errors(self):
965+
self.assertRaises(ValueError, codecs.escape_decode, br"\x")
966+
self.assertRaises(ValueError, codecs.escape_decode, br"[\x]")
967+
self.assertEqual(codecs.escape_decode(br"[\x]\x", "ignore"), (b"[]", 6))
968+
self.assertEqual(codecs.escape_decode(br"[\x]\x", "replace"), (b"[?]?", 6))
969+
self.assertRaises(ValueError, codecs.escape_decode, br"\x0")
970+
self.assertRaises(ValueError, codecs.escape_decode, br"[\x0]")
971+
self.assertEqual(codecs.escape_decode(br"[\x0]\x0", "ignore"), (b"[]", 8))
972+
self.assertEqual(codecs.escape_decode(br"[\x0]\x0", "replace"), (b"[?]?", 8))
973+
930974
class RecodingTest(unittest.TestCase):
931975
def test_recoding(self):
932976
f = io.BytesIO()

Misc/NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ What's New in Python 3.3.1?
1212
Core and Builtins
1313
-----------------
1414

15+
- Issue #16975: Fix error handling bug in the escape-decode bytes decoder.
16+
1517
- Issue #14850: Now a charmap decoder treats U+FFFE as "undefined mapping"
1618
in any mapping, not only in a string.
1719

Objects/bytesobject.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,10 @@ PyObject *PyBytes_DecodeEscape(const char *s,
480480
errors);
481481
goto failed;
482482
}
483+
/* skip \x */
484+
if (s < end && Py_ISXDIGIT(s[0]))
485+
s++; /* and a hexdigit */
486+
break;
483487
default:
484488
*p++ = '\\';
485489
s--;

0 commit comments

Comments
 (0)