@@ -24,8 +24,10 @@ static inline uint32_t coalesce(uint32_t a, uint32_t b)
24
24
/* Helper for single-byte encodings which use a conversion table */
25
25
static int mbfl_conv_singlebyte_table (int c , mbfl_convert_filter * filter , int tbl_min , const unsigned short tbl [])
26
26
{
27
- if (c < tbl_min ) {
27
+ if (c >= 0 && c < tbl_min ) {
28
28
CK ((* filter -> output_function )(c , filter -> data ));
29
+ } else if (c < 0 ) {
30
+ CK ((* filter -> output_function )(MBFL_BAD_INPUT , filter -> data ));
29
31
} else {
30
32
CK ((* filter -> output_function )(coalesce (tbl [c - tbl_min ], MBFL_BAD_INPUT ), filter -> data ));
31
33
}
@@ -34,10 +36,10 @@ static int mbfl_conv_singlebyte_table(int c, mbfl_convert_filter *filter, int tb
34
36
35
37
static int mbfl_conv_reverselookup_table (int c , mbfl_convert_filter * filter , int tbl_min , const unsigned short tbl [])
36
38
{
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 ) {
40
40
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 ));
41
43
} else {
42
44
for (int i = 0 ; i < 256 - tbl_min ; i ++ ) {
43
45
if (c == tbl [i ]) {
@@ -144,7 +146,7 @@ static int mbfl_filt_conv_ascii_wchar(int c, mbfl_convert_filter *filter)
144
146
145
147
static int mbfl_filt_conv_wchar_ascii (int c , mbfl_convert_filter * filter )
146
148
{
147
- if (c < 0x80 && c != MBFL_BAD_INPUT ) {
149
+ if (c >= 0 && c < 0x80 && c != MBFL_BAD_INPUT ) {
148
150
CK ((* filter -> output_function )(c , filter -> data ));
149
151
} else {
150
152
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)
198
200
199
201
static int mbfl_filt_conv_wchar_8859_1 (int c , mbfl_convert_filter * filter )
200
202
{
201
- if (c < 0x100 && c != MBFL_BAD_INPUT ) {
203
+ if (c >= 0 && c < 0x100 && c != MBFL_BAD_INPUT ) {
202
204
CK ((* filter -> output_function )(c , filter -> data ));
203
205
} else {
204
206
CK (mbfl_filt_conv_illegal_output (c , filter ));
@@ -492,15 +494,17 @@ DEF_SB(cp1252, "Windows-1252", "Windows-1252", cp1252_aliases);
492
494
493
495
static int mbfl_filt_conv_wchar_cp1252 (int c , mbfl_convert_filter * filter )
494
496
{
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 ) {
496
500
for (int n = 0 ; n < 32 ; n ++ ) {
497
501
if (c == cp1252_ucs_table [n ]) {
498
502
CK ((* filter -> output_function )(0x80 + n , filter -> data ));
499
503
return 0 ;
500
504
}
501
505
}
502
506
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 ) {
504
508
CK ((* filter -> output_function )(c , filter -> data ));
505
509
} else {
506
510
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)
705
709
{
706
710
if (c >= 0x28 && c <= 0x2F ) {
707
711
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 ) {
709
713
CK (mbfl_filt_conv_illegal_output (c , filter ));
710
714
} else if (c < 0xA0 ) {
711
715
CK ((* filter -> output_function )(c , filter -> data ));
0 commit comments