mirror of https://github.com/python/cpython
Issue #16975: Fix error handling bug in the escape-decode bytes decoder.
This commit is contained in:
commit
e58785b200
|
@ -927,6 +927,50 @@ class EscapeDecodeTest(unittest.TestCase):
|
||||||
def test_empty(self):
|
def test_empty(self):
|
||||||
self.assertEqual(codecs.escape_decode(""), (b"", 0))
|
self.assertEqual(codecs.escape_decode(""), (b"", 0))
|
||||||
|
|
||||||
|
def test_raw(self):
|
||||||
|
for b in range(256):
|
||||||
|
if b != b'\\'[0]:
|
||||||
|
self.assertEqual(codecs.escape_decode(bytes([b]) + b'0'),
|
||||||
|
(bytes([b]) + 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 range(256):
|
||||||
|
if b not in b'\n"\'\\abtnvfr01234567x':
|
||||||
|
self.assertEqual(codecs.escape_decode(b'\\' + bytes([b])),
|
||||||
|
(b'\\' + bytes([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):
|
class RecodingTest(unittest.TestCase):
|
||||||
def test_recoding(self):
|
def test_recoding(self):
|
||||||
f = io.BytesIO()
|
f = io.BytesIO()
|
||||||
|
|
|
@ -12,6 +12,8 @@ What's New in Python 3.3.1?
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #16975: Fix error handling bug in the escape-decode bytes decoder.
|
||||||
|
|
||||||
- Issue #14850: Now a charmap decoder treats U+FFFE as "undefined mapping"
|
- Issue #14850: Now a charmap decoder treats U+FFFE as "undefined mapping"
|
||||||
in any mapping, not only in a string.
|
in any mapping, not only in a string.
|
||||||
|
|
||||||
|
|
|
@ -480,6 +480,10 @@ PyObject *PyBytes_DecodeEscape(const char *s,
|
||||||
errors);
|
errors);
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
|
/* skip \x */
|
||||||
|
if (s < end && Py_ISXDIGIT(s[0]))
|
||||||
|
s++; /* and a hexdigit */
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
*p++ = '\\';
|
*p++ = '\\';
|
||||||
s--;
|
s--;
|
||||||
|
|
Loading…
Reference in New Issue