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

Skip to content

Commit 11bdf91

Browse files
committed
Issue #18509: handle PyUnicode_Writer() error
1 parent 33aaa73 commit 11bdf91

7 files changed

Lines changed: 102 additions & 84 deletions

File tree

Modules/cjkcodecs/_codecs_cn.c

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@
2727
if ((dc1) == 0xa1 && (dc2) == 0xaa) OUTCHAR(0x2014); \
2828
else if ((dc1) == 0xa8 && (dc2) == 0x44) OUTCHAR(0x2015); \
2929
else if ((dc1) == 0xa1 && (dc2) == 0xa4) OUTCHAR(0x00b7); \
30-
else TRYMAP_DEC(gb2312, writer, dc1 ^ 0x80, dc2 ^ 0x80); \
31-
else TRYMAP_DEC(gbkext, writer, dc1, dc2);
30+
else if (TRYMAP_DEC(gb2312, decoded, dc1 ^ 0x80, dc2 ^ 0x80)) \
31+
OUTCHAR(decoded); \
32+
else if (TRYMAP_DEC(gbkext, decoded, dc1, dc2)) \
33+
OUTCHAR(decoded);
3234

3335
#define GBK_ENCODE(code, assi) \
3436
if ((code) == 0x2014) (assi) = 0xa1aa; \
@@ -74,6 +76,7 @@ DECODER(gb2312)
7476
{
7577
while (inleft > 0) {
7678
unsigned char c = **inbuf;
79+
Py_UCS4 decoded;
7780

7881
if (c < 0x80) {
7982
OUTCHAR(c);
@@ -82,7 +85,8 @@ DECODER(gb2312)
8285
}
8386

8487
REQUIRE_INBUF(2)
85-
TRYMAP_DEC(gb2312, writer, c ^ 0x80, INBYTE2 ^ 0x80) {
88+
if (TRYMAP_DEC(gb2312, decoded, c ^ 0x80, INBYTE2 ^ 0x80)) {
89+
OUTCHAR(decoded);
8690
NEXT_IN(2);
8791
}
8892
else return 1;
@@ -131,6 +135,7 @@ DECODER(gbk)
131135
{
132136
while (inleft > 0) {
133137
unsigned char c = INBYTE1;
138+
Py_UCS4 decoded;
134139

135140
if (c < 0x80) {
136141
OUTCHAR(c);
@@ -236,6 +241,7 @@ DECODER(gb18030)
236241
{
237242
while (inleft > 0) {
238243
unsigned char c = INBYTE1, c2;
244+
Py_UCS4 decoded;
239245

240246
if (c < 0x80) {
241247
OUTCHAR(c);
@@ -284,7 +290,8 @@ DECODER(gb18030)
284290
}
285291

286292
GBK_DECODE(c, c2, writer)
287-
else TRYMAP_DEC(gb18030ext, writer, c, c2);
293+
else if (TRYMAP_DEC(gb18030ext, decoded, c, c2))
294+
OUTCHAR(decoded);
288295
else return 1;
289296

290297
NEXT_IN(2);
@@ -372,6 +379,7 @@ DECODER(hz)
372379
{
373380
while (inleft > 0) {
374381
unsigned char c = INBYTE1;
382+
Py_UCS4 decoded;
375383

376384
if (c == '~') {
377385
unsigned char c2 = INBYTE2;
@@ -403,7 +411,8 @@ DECODER(hz)
403411
}
404412
else { /* GB mode */
405413
REQUIRE_INBUF(2)
406-
TRYMAP_DEC(gb2312, writer, c, INBYTE2) {
414+
if (TRYMAP_DEC(gb2312, decoded, c, INBYTE2)) {
415+
OUTCHAR(decoded);
407416
NEXT_IN(2);
408417
}
409418
else

Modules/cjkcodecs/_codecs_hk.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,13 +118,14 @@ DECODER(big5hkscs)
118118
REQUIRE_INBUF(2)
119119

120120
if (0xc6 > c || c > 0xc8 || (c < 0xc7 && INBYTE2 < 0xa1)) {
121-
TRYMAP_DEC(big5, writer, c, INBYTE2) {
121+
if (TRYMAP_DEC(big5, decoded, c, INBYTE2)) {
122+
OUTCHAR(decoded);
122123
NEXT_IN(2);
123124
continue;
124125
}
125126
}
126127

127-
TRYMAP_DEC_CHAR(big5hkscs, decoded, c, INBYTE2)
128+
if (TRYMAP_DEC(big5hkscs, decoded, c, INBYTE2))
128129
{
129130
int s = BH2S(c, INBYTE2);
130131
const unsigned char *hintbase;

Modules/cjkcodecs/_codecs_iso2022.c

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -566,7 +566,7 @@ static Py_UCS4
566566
ksx1001_decoder(const unsigned char *data)
567567
{
568568
Py_UCS4 u;
569-
TRYMAP_DEC_CHAR(ksx1001, u, data[0], data[1])
569+
if (TRYMAP_DEC(ksx1001, u, data[0], data[1]))
570570
return u;
571571
else
572572
return MAP_UNMAPPABLE;
@@ -604,7 +604,7 @@ jisx0208_decoder(const unsigned char *data)
604604
Py_UCS4 u;
605605
if (data[0] == 0x21 && data[1] == 0x40) /* F/W REVERSE SOLIDUS */
606606
return 0xff3c;
607-
else TRYMAP_DEC_CHAR(jisx0208, u, data[0], data[1])
607+
else if (TRYMAP_DEC(jisx0208, u, data[0], data[1]))
608608
return u;
609609
else
610610
return MAP_UNMAPPABLE;
@@ -643,7 +643,7 @@ static Py_UCS4
643643
jisx0212_decoder(const unsigned char *data)
644644
{
645645
Py_UCS4 u;
646-
TRYMAP_DEC_CHAR(jisx0212, u, data[0], data[1])
646+
if (TRYMAP_DEC(jisx0212, u, data[0], data[1]))
647647
return u;
648648
else
649649
return MAP_UNMAPPABLE;
@@ -697,11 +697,11 @@ jisx0213_2000_1_decoder(const unsigned char *data)
697697
EMULATE_JISX0213_2000_DECODE_PLANE1(u, data[0], data[1])
698698
else if (data[0] == 0x21 && data[1] == 0x40) /* F/W REVERSE SOLIDUS */
699699
return 0xff3c;
700-
else TRYMAP_DEC_CHAR(jisx0208, u, data[0], data[1]);
701-
else TRYMAP_DEC_CHAR(jisx0213_1_bmp, u, data[0], data[1]);
702-
else TRYMAP_DEC_CHAR(jisx0213_1_emp, u, data[0], data[1])
700+
else if (TRYMAP_DEC(jisx0208, u, data[0], data[1]));
701+
else if (TRYMAP_DEC(jisx0213_1_bmp, u, data[0], data[1]));
702+
else if (TRYMAP_DEC(jisx0213_1_emp, u, data[0], data[1]))
703703
u |= 0x20000;
704-
else TRYMAP_DEC_CHAR(jisx0213_pair, u, data[0], data[1]);
704+
else if (TRYMAP_DEC(jisx0213_pair, u, data[0], data[1]));
705705
else
706706
return MAP_UNMAPPABLE;
707707
return u;
@@ -712,8 +712,8 @@ jisx0213_2000_2_decoder(const unsigned char *data)
712712
{
713713
Py_UCS4 u;
714714
EMULATE_JISX0213_2000_DECODE_PLANE2_CHAR(u, data[0], data[1])
715-
TRYMAP_DEC_CHAR(jisx0213_2_bmp, u, data[0], data[1]);
716-
else TRYMAP_DEC_CHAR(jisx0213_2_emp, u, data[0], data[1])
715+
if (TRYMAP_DEC(jisx0213_2_bmp, u, data[0], data[1]));
716+
else if (TRYMAP_DEC(jisx0213_2_emp, u, data[0], data[1]))
717717
u |= 0x20000;
718718
else
719719
return MAP_UNMAPPABLE;
@@ -727,11 +727,11 @@ jisx0213_2004_1_decoder(const unsigned char *data)
727727
Py_UCS4 u;
728728
if (data[0] == 0x21 && data[1] == 0x40) /* F/W REVERSE SOLIDUS */
729729
return 0xff3c;
730-
else TRYMAP_DEC_CHAR(jisx0208, u, data[0], data[1]);
731-
else TRYMAP_DEC_CHAR(jisx0213_1_bmp, u, data[0], data[1]);
732-
else TRYMAP_DEC_CHAR(jisx0213_1_emp, u, data[0], data[1])
730+
else if (TRYMAP_DEC(jisx0208, u, data[0], data[1]));
731+
else if (TRYMAP_DEC(jisx0213_1_bmp, u, data[0], data[1]));
732+
else if (TRYMAP_DEC(jisx0213_1_emp, u, data[0], data[1]))
733733
u |= 0x20000;
734-
else TRYMAP_DEC_CHAR(jisx0213_pair, u, data[0], data[1]);
734+
else if (TRYMAP_DEC(jisx0213_pair, u, data[0], data[1]));
735735
else
736736
return MAP_UNMAPPABLE;
737737
return u;
@@ -741,8 +741,8 @@ static Py_UCS4
741741
jisx0213_2004_2_decoder(const unsigned char *data)
742742
{
743743
Py_UCS4 u;
744-
TRYMAP_DEC_CHAR(jisx0213_2_bmp, u, data[0], data[1]);
745-
else TRYMAP_DEC_CHAR(jisx0213_2_emp, u, data[0], data[1])
744+
if (TRYMAP_DEC(jisx0213_2_bmp, u, data[0], data[1]));
745+
else if (TRYMAP_DEC(jisx0213_2_emp, u, data[0], data[1]))
746746
u |= 0x20000;
747747
else
748748
return MAP_UNMAPPABLE;
@@ -950,7 +950,7 @@ static Py_UCS4
950950
gb2312_decoder(const unsigned char *data)
951951
{
952952
Py_UCS4 u;
953-
TRYMAP_DEC_CHAR(gb2312, u, data[0], data[1])
953+
if (TRYMAP_DEC(gb2312, u, data[0], data[1]))
954954
return u;
955955
else
956956
return MAP_UNMAPPABLE;

Modules/cjkcodecs/_codecs_jp.c

Lines changed: 39 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ DECODER(cp932)
8585
{
8686
while (inleft > 0) {
8787
unsigned char c = INBYTE1, c2;
88+
Py_UCS4 decoded;
8889

8990
if (c <= 0x80) {
9091
OUTCHAR(c);
@@ -109,7 +110,8 @@ DECODER(cp932)
109110
REQUIRE_INBUF(2)
110111
c2 = INBYTE2;
111112

112-
TRYMAP_DEC(cp932ext, writer, c, c2);
113+
if (TRYMAP_DEC(cp932ext, decoded, c, c2))
114+
OUTCHAR(decoded);
113115
else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea)){
114116
if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)
115117
return 1;
@@ -119,8 +121,10 @@ DECODER(cp932)
119121
c = (2 * c + (c2 < 0x5e ? 0 : 1) + 0x21);
120122
c2 = (c2 < 0x5e ? c2 : c2 - 0x5e) + 0x21;
121123

122-
TRYMAP_DEC(jisx0208, writer, c, c2);
123-
else return 1;
124+
if (TRYMAP_DEC(jisx0208, decoded, c, c2))
125+
OUTCHAR(decoded);
126+
else
127+
return 1;
124128
}
125129
else if (c >= 0xf0 && c <= 0xf9) {
126130
if ((c2 >= 0x40 && c2 <= 0x7e) ||
@@ -235,7 +239,7 @@ DECODER(euc_jis_2004)
235239
{
236240
while (inleft > 0) {
237241
unsigned char c = INBYTE1;
238-
Py_UCS4 code;
242+
Py_UCS4 code, decoded;
239243

240244
if (c < 0x80) {
241245
OUTCHAR(c);
@@ -265,13 +269,15 @@ DECODER(euc_jis_2004)
265269

266270
/* JIS X 0213 Plane 2 or JIS X 0212 (see NOTES) */
267271
EMULATE_JISX0213_2000_DECODE_PLANE2(writer, c2, c3)
268-
else TRYMAP_DEC(jisx0213_2_bmp, writer, c2, c3) ;
269-
else TRYMAP_DEC_CHAR(jisx0213_2_emp, code, c2, c3) {
272+
else if (TRYMAP_DEC(jisx0213_2_bmp, decoded, c2, c3))
273+
OUTCHAR(decoded);
274+
else if (TRYMAP_DEC(jisx0213_2_emp, code, c2, c3)) {
270275
OUTCHAR(EMPBASE | code);
271276
NEXT_IN(3);
272277
continue;
273278
}
274-
else TRYMAP_DEC(jisx0212, writer, c2, c3) ;
279+
else if (TRYMAP_DEC(jisx0212, decoded, c2, c3))
280+
OUTCHAR(decoded);
275281
else return 1;
276282
NEXT_IN(3);
277283
}
@@ -286,14 +292,16 @@ DECODER(euc_jis_2004)
286292
EMULATE_JISX0213_2000_DECODE_PLANE1(writer, c, c2)
287293
else if (c == 0x21 && c2 == 0x40) OUTCHAR(0xff3c);
288294
else if (c == 0x22 && c2 == 0x32) OUTCHAR(0xff5e);
289-
else TRYMAP_DEC(jisx0208, writer, c, c2);
290-
else TRYMAP_DEC(jisx0213_1_bmp, writer, c, c2);
291-
else TRYMAP_DEC_CHAR(jisx0213_1_emp, code, c, c2) {
295+
else if (TRYMAP_DEC(jisx0208, decoded, c, c2))
296+
OUTCHAR(decoded);
297+
else if (TRYMAP_DEC(jisx0213_1_bmp, decoded, c, c2))
298+
OUTCHAR(decoded);
299+
else if (TRYMAP_DEC(jisx0213_1_emp, code, c, c2)) {
292300
OUTCHAR(EMPBASE | code);
293301
NEXT_IN(2);
294302
continue;
295303
}
296-
else TRYMAP_DEC_CHAR(jisx0213_pair, code, c, c2) {
304+
else if (TRYMAP_DEC(jisx0213_pair, code, c, c2)) {
297305
OUTCHAR2(code >> 16, code & 0xffff);
298306
NEXT_IN(2);
299307
continue;
@@ -367,6 +375,7 @@ DECODER(euc_jp)
367375
{
368376
while (inleft > 0) {
369377
unsigned char c = INBYTE1;
378+
Py_UCS4 decoded;
370379

371380
if (c < 0x80) {
372381
OUTCHAR(c);
@@ -394,7 +403,8 @@ DECODER(euc_jp)
394403
c2 = INBYTE2;
395404
c3 = INBYTE3;
396405
/* JIS X 0212 */
397-
TRYMAP_DEC(jisx0212, writer, c2 ^ 0x80, c3 ^ 0x80) {
406+
if (TRYMAP_DEC(jisx0212, decoded, c2 ^ 0x80, c3 ^ 0x80)) {
407+
OUTCHAR(decoded);
398408
NEXT_IN(3);
399409
}
400410
else
@@ -412,9 +422,10 @@ DECODER(euc_jp)
412422
OUTCHAR(0xff3c);
413423
else
414424
#endif
415-
TRYMAP_DEC(jisx0208, writer,
416-
c ^ 0x80, c2 ^ 0x80) ;
417-
else return 1;
425+
if (TRYMAP_DEC(jisx0208, decoded, c ^ 0x80, c2 ^ 0x80))
426+
OUTCHAR(decoded);
427+
else
428+
return 1;
418429
NEXT_IN(2);
419430
}
420431
}
@@ -486,6 +497,7 @@ DECODER(shift_jis)
486497
{
487498
while (inleft > 0) {
488499
unsigned char c = INBYTE1;
500+
Py_UCS4 decoded;
489501

490502
#ifdef STRICT_BUILD
491503
JISX0201_R_DECODE(c, writer)
@@ -514,7 +526,8 @@ DECODER(shift_jis)
514526
continue;
515527
}
516528
#endif
517-
TRYMAP_DEC(jisx0208, writer, c1, c2) {
529+
if (TRYMAP_DEC(jisx0208, decoded, c1, c2)) {
530+
OUTCHAR(decoded);
518531
NEXT_IN(2);
519532
continue;
520533
}
@@ -636,7 +649,7 @@ DECODER(shift_jis_2004)
636649
JISX0201_DECODE(c, writer)
637650
else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xfc)){
638651
unsigned char c1, c2;
639-
Py_UCS4 code;
652+
Py_UCS4 code, decoded;
640653

641654
REQUIRE_INBUF(2)
642655
c2 = INBYTE2;
@@ -652,17 +665,14 @@ DECODER(shift_jis_2004)
652665
c1 += 0x21;
653666
EMULATE_JISX0213_2000_DECODE_PLANE1(writer,
654667
c1, c2)
655-
else TRYMAP_DEC(jisx0208, writer, c1, c2) {
656-
}
657-
else TRYMAP_DEC(jisx0213_1_bmp, writer,
658-
c1, c2) {
659-
}
660-
else TRYMAP_DEC_CHAR(jisx0213_1_emp, code, c1, c2) {
668+
else if (TRYMAP_DEC(jisx0208, decoded, c1, c2))
669+
OUTCHAR(decoded);
670+
else if (TRYMAP_DEC(jisx0213_1_bmp, decoded, c1, c2))
671+
OUTCHAR(decoded);
672+
else if (TRYMAP_DEC(jisx0213_1_emp, code, c1, c2))
661673
OUTCHAR(EMPBASE | code);
662-
}
663-
else TRYMAP_DEC_CHAR(jisx0213_pair, code, c1, c2) {
674+
else if (TRYMAP_DEC(jisx0213_pair, code, c1, c2))
664675
OUTCHAR2(code >> 16, code & 0xffff);
665-
}
666676
else
667677
return 1;
668678
NEXT_IN(2);
@@ -674,9 +684,9 @@ DECODER(shift_jis_2004)
674684

675685
EMULATE_JISX0213_2000_DECODE_PLANE2(writer,
676686
c1, c2)
677-
else TRYMAP_DEC(jisx0213_2_bmp, writer,
678-
c1, c2) {
679-
} else TRYMAP_DEC_CHAR(jisx0213_2_emp, code, c1, c2) {
687+
else if (TRYMAP_DEC(jisx0213_2_bmp, decoded, c1, c2))
688+
OUTCHAR(decoded);
689+
else if (TRYMAP_DEC(jisx0213_2_emp, code, c1, c2)) {
680690
OUTCHAR(EMPBASE | code);
681691
NEXT_IN(2);
682692
continue;

0 commit comments

Comments
 (0)