# HG changeset patch # User Kenichi Handa # Date 1245320943 0 # Node ID 7ead5036354414f7c943b7955562b299bc930964 # Parent ae2d84ad61359f28149c56f9e1b3296716d4cde0 (decode_coding_iso_2022): Check MSB of bytes more rigidly. diff -r ae2d84ad6135 -r 7ead50363544 src/coding.c --- a/src/coding.c Thu Jun 18 09:49:05 2009 +0000 +++ b/src/coding.c Thu Jun 18 10:29:03 2009 +0000 @@ -3600,7 +3600,7 @@ while (1) { - int c1, c2; + int c1, c2, c3; src_base = src; consumed_chars_base = consumed_chars; @@ -3984,26 +3984,28 @@ } /* Now we know CHARSET and 1st position code C1 of a character. - Produce a decoded character while getting 2nd position code - C2 if necessary. */ - c1 &= 0x7F; + Produce a decoded character while getting 2nd and 3rd + position codes C2, C3 if necessary. */ if (CHARSET_DIMENSION (charset) > 1) { ONE_MORE_BYTE (c2); - if (c2 < 0x20 || (c2 >= 0x80 && c2 < 0xA0)) + if (c2 < 0x20 || (c2 >= 0x80 && c2 < 0xA0) + || ((c1 & 0x80) != (c2 & 0x80))) /* C2 is not in a valid range. */ goto invalid_code; - c1 = (c1 << 8) | (c2 & 0x7F); - if (CHARSET_DIMENSION (charset) > 2) + if (CHARSET_DIMENSION (charset) == 2) + c1 = (c1 << 8) | c2; + else { - ONE_MORE_BYTE (c2); - if (c2 < 0x20 || (c2 >= 0x80 && c2 < 0xA0)) - /* C2 is not in a valid range. */ + ONE_MORE_BYTE (c3); + if (c3 < 0x20 || (c3 >= 0x80 && c3 < 0xA0) + || ((c1 & 0x80) != (c3 & 0x80))) + /* C3 is not in a valid range. */ goto invalid_code; - c1 = (c1 << 8) | (c2 & 0x7F); + c1 = (c1 << 16) | (c2 << 8) | c2; } } - + c1 &= 0x7F7F7F; CODING_DECODE_CHAR (coding, src, src_base, src_end, charset, c1, c); if (c < 0) {