Skip to content

Commit 6d525a4

Browse files
committed
Fix legacy conversion filter for ISO-2022-KR
1 parent 8a915ed commit 6d525a4

File tree

2 files changed

+17
-12
lines changed

2 files changed

+17
-12
lines changed

ext/mbstring/libmbfl/filters/mbfilter_iso2022_kr.c

+10-11
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,14 @@ int mbfl_filt_conv_wchar_2022kr(int c, mbfl_convert_filter *filter)
190190
{
191191
int c1, c2, s = 0;
192192

193+
if ((filter->status & 0x100) == 0) {
194+
CK((*filter->output_function)(0x1b, filter->data)); /* ESC */
195+
CK((*filter->output_function)('$', filter->data));
196+
CK((*filter->output_function)(')', filter->data));
197+
CK((*filter->output_function)('C', filter->data));
198+
filter->status |= 0x100;
199+
}
200+
193201
if (c >= ucs_a1_uhc_table_min && c < ucs_a1_uhc_table_max) {
194202
s = ucs_a1_uhc_table[c - ucs_a1_uhc_table_min];
195203
} else if (c >= ucs_a2_uhc_table_min && c < ucs_a2_uhc_table_max) {
@@ -211,9 +219,7 @@ int mbfl_filt_conv_wchar_2022kr(int c, mbfl_convert_filter *filter)
211219
/* exclude UHC extension area */
212220
if (c1 < 0xa1 || c2 < 0xa1) {
213221
s = c;
214-
}
215-
216-
if (s & 0x8000) {
222+
} else if (s & 0x8000) {
217223
s -= 0x8080;
218224
}
219225

@@ -235,13 +241,6 @@ int mbfl_filt_conv_wchar_2022kr(int c, mbfl_convert_filter *filter)
235241
}
236242
CK((*filter->output_function)(s, filter->data));
237243
} else {
238-
if ((filter->status & 0x100) == 0) {
239-
CK((*filter->output_function)(0x1b, filter->data)); /* ESC */
240-
CK((*filter->output_function)('$', filter->data));
241-
CK((*filter->output_function)(')', filter->data));
242-
CK((*filter->output_function)('C', filter->data));
243-
filter->status |= 0x100;
244-
}
245244
if ((filter->status & 0x10) == 0) {
246245
CK((*filter->output_function)(0x0e, filter->data)); /* shift out */
247246
filter->status |= 0x10;
@@ -259,7 +258,7 @@ int mbfl_filt_conv_wchar_2022kr(int c, mbfl_convert_filter *filter)
259258
static int mbfl_filt_conv_any_2022kr_flush(mbfl_convert_filter *filter)
260259
{
261260
/* back to ascii */
262-
if (filter->status & 0xff00) {
261+
if (filter->status & 0x10) {
263262
CK((*filter->output_function)(0x0f, filter->data)); /* shift in */
264263
}
265264

ext/mbstring/tests/mb_send_mail07.phpt

+7-1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@ if (mb_language("korean")) {
2828
mb_send_mail($to, "�׽�Ʈ ".mb_language(), "�׽�Ʈ");
2929
readfile(__DIR__ . "/mb_send_mail07.eml");
3030
}
31+
32+
/* Note: The subject line below, "=?ISO-2022-KR?B?GyQpQw5FVz06Ri4PIEtvcmVhbg==?=",
33+
* used to be "=?ISO-2022-KR?B?GyQpQw5FVz06Ri4PIEtvcmVhbg8=?=". That was because
34+
* the Base64-encoded ISO-2022-KR string contained an extraneous 0xF ('shift out')
35+
* byte. 'Shift out' is only needed to return to ASCII mode, but the string
36+
* contained one despite already being in ASCII mode. */
3137
?>
3238
--CLEAN--
3339
<?php
@@ -42,7 +48,7 @@ Content-Transfer-Encoding: %s
4248

4349
%s
4450
45-
Subject: =?ISO-2022-KR?B?GyQpQw5FVz06Ri4PIEtvcmVhbg8=?=
51+
Subject: =?ISO-2022-KR?B?GyQpQw5FVz06Ri4PIEtvcmVhbg==?=
4652
MIME-Version: 1.0
4753
Content-Type: text/plain; charset=ISO-2022-KR
4854
Content-Transfer-Encoding: 7bit

0 commit comments

Comments
 (0)