@@ -156,7 +156,7 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter)
156
156
case 0 :
157
157
if (c == 0x26 ) { /* '&' shift character */
158
158
filter -> status ++ ;
159
- } else if (c >= 0 && c < 0x80 ) { /* ASCII */
159
+ } else if (c >= 0x20 && c <= 0x7E ) { /* ASCII */
160
160
CK ((* filter -> output_function )(c , filter -> data ));
161
161
} else { /* illegal character */
162
162
s = c & MBFL_WCSGROUP_MASK ;
@@ -195,7 +195,15 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter)
195
195
}
196
196
} else {
197
197
filter -> cache = n ;
198
- CK ((* filter -> output_function )(s , filter -> data ));
198
+ /* Characters which can be expressed as literal, ASCII characters
199
+ * should not be Base64-encoded */
200
+ if (s < 0x20 || s > 0x7E || s == '&' ) {
201
+ CK ((* filter -> output_function )(s , filter -> data ));
202
+ } else {
203
+ s &= MBFL_WCSGROUP_MASK ;
204
+ s |= MBFL_WCSGROUP_THROUGH ;
205
+ CK ((* filter -> output_function )(s , filter -> data ));
206
+ }
199
207
}
200
208
break ;
201
209
@@ -227,7 +235,15 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter)
227
235
}
228
236
} else {
229
237
filter -> cache = n ;
230
- CK ((* filter -> output_function )(s , filter -> data ));
238
+ /* Characters which can be expressed as literal, ASCII characters
239
+ * should not be Base64-encoded */
240
+ if (s < 0x20 || s > 0x7E || s == '&' ) {
241
+ CK ((* filter -> output_function )(s , filter -> data ));
242
+ } else {
243
+ s &= MBFL_WCSGROUP_MASK ;
244
+ s |= MBFL_WCSGROUP_THROUGH ;
245
+ CK ((* filter -> output_function )(s , filter -> data ));
246
+ }
231
247
}
232
248
break ;
233
249
@@ -254,7 +270,15 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter)
254
270
}
255
271
} else {
256
272
filter -> cache = 0 ;
257
- CK ((* filter -> output_function )(s , filter -> data ));
273
+ /* Characters which can be expressed as literal, ASCII characters
274
+ * should not be Base64-encoded */
275
+ if (s < 0x20 || s > 0x7E || s == '&' ) {
276
+ CK ((* filter -> output_function )(s , filter -> data ));
277
+ } else {
278
+ s &= MBFL_WCSGROUP_MASK ;
279
+ s |= MBFL_WCSGROUP_THROUGH ;
280
+ CK ((* filter -> output_function )(s , filter -> data ));
281
+ }
258
282
}
259
283
break ;
260
284
0 commit comments