mirror of
https://github.com/python/cpython.git
synced 2025-09-27 10:50:04 +00:00
[3.12] gh-101180: Fix a bug where iso2022_jp_3 and iso2022_jp_2004 codecs read out of bounds (gh-111695) (gh-111769)
gh-101180: Fix a bug where iso2022_jp_3 and iso2022_jp_2004 codecs read out of bounds (gh-111695)
(cherry picked from commit c8faa3568a
)
Co-authored-by: Masayuki Moriyama <masayuki.moriyama@miraclelinux.com>
This commit is contained in:
parent
e0c2bf4672
commit
c4e524c3f2
3 changed files with 53 additions and 3 deletions
|
@ -24,6 +24,52 @@ class Test_ISO2022_JP2(multibytecodec_support.TestBase, unittest.TestCase):
|
||||||
(b'ab\x1BNdef', 'replace', 'abdef'),
|
(b'ab\x1BNdef', 'replace', 'abdef'),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
class Test_ISO2022_JP3(multibytecodec_support.TestBase, unittest.TestCase):
|
||||||
|
encoding = 'iso2022_jp_3'
|
||||||
|
tstring = multibytecodec_support.load_teststring('iso2022_jp')
|
||||||
|
codectests = COMMON_CODEC_TESTS + (
|
||||||
|
(b'ab\x1BNdef', 'replace', 'ab\x1BNdef'),
|
||||||
|
(b'\x1B$(O\x2E\x23\x1B(B', 'strict', '\u3402' ),
|
||||||
|
(b'\x1B$(O\x2E\x22\x1B(B', 'strict', '\U0002000B' ),
|
||||||
|
(b'\x1B$(O\x24\x77\x1B(B', 'strict', '\u304B\u309A'),
|
||||||
|
(b'\x1B$(P\x21\x22\x1B(B', 'strict', '\u4E02' ),
|
||||||
|
(b'\x1B$(P\x7E\x76\x1B(B', 'strict', '\U0002A6B2' ),
|
||||||
|
('\u3402', 'strict', b'\x1B$(O\x2E\x23\x1B(B'),
|
||||||
|
('\U0002000B', 'strict', b'\x1B$(O\x2E\x22\x1B(B'),
|
||||||
|
('\u304B\u309A', 'strict', b'\x1B$(O\x24\x77\x1B(B'),
|
||||||
|
('\u4E02', 'strict', b'\x1B$(P\x21\x22\x1B(B'),
|
||||||
|
('\U0002A6B2', 'strict', b'\x1B$(P\x7E\x76\x1B(B'),
|
||||||
|
(b'ab\x1B$(O\x2E\x21\x1B(Bdef', 'replace', 'ab\uFFFDdef'),
|
||||||
|
('ab\u4FF1def', 'replace', b'ab?def'),
|
||||||
|
)
|
||||||
|
xmlcharnametest = (
|
||||||
|
'\xAB\u211C\xBB = \u2329\u1234\u232A',
|
||||||
|
b'\x1B$(O\x29\x28\x1B(Bℜ\x1B$(O\x29\x32\x1B(B = ⟨ሴ⟩'
|
||||||
|
)
|
||||||
|
|
||||||
|
class Test_ISO2022_JP2004(multibytecodec_support.TestBase, unittest.TestCase):
|
||||||
|
encoding = 'iso2022_jp_2004'
|
||||||
|
tstring = multibytecodec_support.load_teststring('iso2022_jp')
|
||||||
|
codectests = COMMON_CODEC_TESTS + (
|
||||||
|
(b'ab\x1BNdef', 'replace', 'ab\x1BNdef'),
|
||||||
|
(b'\x1B$(Q\x2E\x23\x1B(B', 'strict', '\u3402' ),
|
||||||
|
(b'\x1B$(Q\x2E\x22\x1B(B', 'strict', '\U0002000B' ),
|
||||||
|
(b'\x1B$(Q\x24\x77\x1B(B', 'strict', '\u304B\u309A'),
|
||||||
|
(b'\x1B$(P\x21\x22\x1B(B', 'strict', '\u4E02' ),
|
||||||
|
(b'\x1B$(P\x7E\x76\x1B(B', 'strict', '\U0002A6B2' ),
|
||||||
|
('\u3402', 'strict', b'\x1B$(Q\x2E\x23\x1B(B'),
|
||||||
|
('\U0002000B', 'strict', b'\x1B$(Q\x2E\x22\x1B(B'),
|
||||||
|
('\u304B\u309A', 'strict', b'\x1B$(Q\x24\x77\x1B(B'),
|
||||||
|
('\u4E02', 'strict', b'\x1B$(P\x21\x22\x1B(B'),
|
||||||
|
('\U0002A6B2', 'strict', b'\x1B$(P\x7E\x76\x1B(B'),
|
||||||
|
(b'ab\x1B$(Q\x2E\x21\x1B(Bdef', 'replace', 'ab\u4FF1def'),
|
||||||
|
('ab\u4FF1def', 'replace', b'ab\x1B$(Q\x2E\x21\x1B(Bdef'),
|
||||||
|
)
|
||||||
|
xmlcharnametest = (
|
||||||
|
'\xAB\u211C\xBB = \u2329\u1234\u232A',
|
||||||
|
b'\x1B$(Q\x29\x28\x1B(Bℜ\x1B$(Q\x29\x32\x1B(B = ⟨ሴ⟩'
|
||||||
|
)
|
||||||
|
|
||||||
class Test_ISO2022_KR(multibytecodec_support.TestBase, unittest.TestCase):
|
class Test_ISO2022_KR(multibytecodec_support.TestBase, unittest.TestCase):
|
||||||
encoding = 'iso2022_kr'
|
encoding = 'iso2022_kr'
|
||||||
tstring = multibytecodec_support.load_teststring('iso2022_kr')
|
tstring = multibytecodec_support.load_teststring('iso2022_kr')
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Fix a bug where ``iso2022_jp_3`` and ``iso2022_jp_2004`` codecs read out of bounds
|
|
@ -207,8 +207,9 @@ ENCODER(iso2022)
|
||||||
|
|
||||||
encoded = MAP_UNMAPPABLE;
|
encoded = MAP_UNMAPPABLE;
|
||||||
for (dsg = CONFIG_DESIGNATIONS; dsg->mark; dsg++) {
|
for (dsg = CONFIG_DESIGNATIONS; dsg->mark; dsg++) {
|
||||||
|
Py_UCS4 buf[2] = {c, 0};
|
||||||
Py_ssize_t length = 1;
|
Py_ssize_t length = 1;
|
||||||
encoded = dsg->encoder(codec, &c, &length);
|
encoded = dsg->encoder(codec, buf, &length);
|
||||||
if (encoded == MAP_MULTIPLE_AVAIL) {
|
if (encoded == MAP_MULTIPLE_AVAIL) {
|
||||||
/* this implementation won't work for pair
|
/* this implementation won't work for pair
|
||||||
* of non-bmp characters. */
|
* of non-bmp characters. */
|
||||||
|
@ -217,9 +218,11 @@ ENCODER(iso2022)
|
||||||
return MBERR_TOOFEW;
|
return MBERR_TOOFEW;
|
||||||
length = -1;
|
length = -1;
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
|
buf[1] = INCHAR2;
|
||||||
length = 2;
|
length = 2;
|
||||||
encoded = dsg->encoder(codec, &c, &length);
|
}
|
||||||
|
encoded = dsg->encoder(codec, buf, &length);
|
||||||
if (encoded != MAP_UNMAPPABLE) {
|
if (encoded != MAP_UNMAPPABLE) {
|
||||||
insize = length;
|
insize = length;
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue