Skip to content

Commit cebb800

Browse files
committedJul 18, 2022
Fix legacy conversion filters for... almost all 8-bit text encodings
1 parent 2eff19e commit cebb800

File tree

1 file changed

+13
-9
lines changed

1 file changed

+13
-9
lines changed
 

‎ext/mbstring/libmbfl/filters/mbfilter_singlebyte.c

+13-9
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@ static inline uint32_t coalesce(uint32_t a, uint32_t b)
2424
/* Helper for single-byte encodings which use a conversion table */
2525
static int mbfl_conv_singlebyte_table(int c, mbfl_convert_filter *filter, int tbl_min, const unsigned short tbl[])
2626
{
27-
if (c < tbl_min) {
27+
if (c >= 0 && c < tbl_min) {
2828
CK((*filter->output_function)(c, filter->data));
29+
} else if (c < 0) {
30+
CK((*filter->output_function)(MBFL_BAD_INPUT, filter->data));
2931
} else {
3032
CK((*filter->output_function)(coalesce(tbl[c - tbl_min], MBFL_BAD_INPUT), filter->data));
3133
}
@@ -34,10 +36,10 @@ static int mbfl_conv_singlebyte_table(int c, mbfl_convert_filter *filter, int tb
3436

3537
static int mbfl_conv_reverselookup_table(int c, mbfl_convert_filter *filter, int tbl_min, const unsigned short tbl[])
3638
{
37-
if (c == MBFL_BAD_INPUT) {
38-
CK(mbfl_filt_conv_illegal_output(c, filter));
39-
} else if (c < tbl_min) {
39+
if (c >= 0 && c < tbl_min) {
4040
CK((*filter->output_function)(c, filter->data));
41+
} else if (c < 0 || c == MBFL_BAD_INPUT) {
42+
CK(mbfl_filt_conv_illegal_output(c, filter));
4143
} else {
4244
for (int i = 0; i < 256 - tbl_min; i++) {
4345
if (c == tbl[i]) {
@@ -144,7 +146,7 @@ static int mbfl_filt_conv_ascii_wchar(int c, mbfl_convert_filter *filter)
144146

145147
static int mbfl_filt_conv_wchar_ascii(int c, mbfl_convert_filter *filter)
146148
{
147-
if (c < 0x80 && c != MBFL_BAD_INPUT) {
149+
if (c >= 0 && c < 0x80 && c != MBFL_BAD_INPUT) {
148150
CK((*filter->output_function)(c, filter->data));
149151
} else {
150152
CK(mbfl_filt_conv_illegal_output(c, filter));
@@ -198,7 +200,7 @@ static int mbfl_filt_conv_8859_1_wchar(int c, mbfl_convert_filter *filter)
198200

199201
static int mbfl_filt_conv_wchar_8859_1(int c, mbfl_convert_filter *filter)
200202
{
201-
if (c < 0x100 && c != MBFL_BAD_INPUT) {
203+
if (c >= 0 && c < 0x100 && c != MBFL_BAD_INPUT) {
202204
CK((*filter->output_function)(c, filter->data));
203205
} else {
204206
CK(mbfl_filt_conv_illegal_output(c, filter));
@@ -492,15 +494,17 @@ DEF_SB(cp1252, "Windows-1252", "Windows-1252", cp1252_aliases);
492494

493495
static int mbfl_filt_conv_wchar_cp1252(int c, mbfl_convert_filter *filter)
494496
{
495-
if (c >= 0x100) {
497+
if (c < 0 || c == MBFL_BAD_INPUT) {
498+
CK(mbfl_filt_conv_illegal_output(c, filter));
499+
} else if (c >= 0x100) {
496500
for (int n = 0; n < 32; n++) {
497501
if (c == cp1252_ucs_table[n]) {
498502
CK((*filter->output_function)(0x80 + n, filter->data));
499503
return 0;
500504
}
501505
}
502506
CK(mbfl_filt_conv_illegal_output(c, filter));
503-
} else if ((c <= 0x7F || c >= 0xA0) && c != MBFL_BAD_INPUT) {
507+
} else if (c <= 0x7F || c >= 0xA0) {
504508
CK((*filter->output_function)(c, filter->data));
505509
} else {
506510
CK(mbfl_filt_conv_illegal_output(c, filter));
@@ -705,7 +709,7 @@ static int mbfl_filt_conv_wchar_armscii8(int c, mbfl_convert_filter *filter)
705709
{
706710
if (c >= 0x28 && c <= 0x2F) {
707711
CK((*filter->output_function)(ucs_armscii8_table[c - 0x28], filter->data));
708-
} else if (c == MBFL_BAD_INPUT) {
712+
} else if (c < 0 || c == MBFL_BAD_INPUT) {
709713
CK(mbfl_filt_conv_illegal_output(c, filter));
710714
} else if (c < 0xA0) {
711715
CK((*filter->output_function)(c, filter->data));

0 commit comments

Comments
 (0)
Please sign in to comment.