[ttssh2-commit] [10770] ISO8859で0x80-0x9fの文字を表示するとクラッシュするので修正

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2023年 6月 17日 (土) 23:47:11 JST


Revision: 10770
          https://osdn.net/projects/ttssh2/scm/svn/commits/10770
Author:   zmatsuo
Date:     2023-06-17 23:47:11 +0900 (Sat, 17 Jun 2023)
Log Message:
-----------
ISO8859で0x80-0x9fの文字を表示するとクラッシュするので修正

- PutU32() でC0,C1文字の特殊処理を行わないよう修正

Modified Paths:
--------------
    trunk/teraterm/teraterm/charset.c
    trunk/teraterm/teraterm/vtterm.c

-------------- next part --------------
Modified: trunk/teraterm/teraterm/charset.c
===================================================================
--- trunk/teraterm/teraterm/charset.c	2023-06-17 14:47:01 UTC (rev 10769)
+++ trunk/teraterm/teraterm/charset.c	2023-06-17 14:47:11 UTC (rev 10770)
@@ -82,7 +82,20 @@
 
 static VttermKanjiWork KanjiWork;
 
-// Unicode\x83x\x81[\x83X\x82ɐ؂\xE8\x91ւ\xA6
+static BOOL IsC0(char32_t b)
+{
+	return (b <= US);
+}
+
+static BOOL IsC1(char32_t b)
+{
+	return ((b>=0x80) && (b<=0x9F));
+}
+
+/**
+ *	PutU32() wrapper
+ *	Unicode\x83x\x81[\x83X\x82ɐ؂\xE8\x91ւ\xA6
+ */
 static void PutChar(BYTE b)
 {
 	PutU32(b);
@@ -539,6 +552,10 @@
 	}
 }
 
+/**
+ *	REPLACEMENT_CHARACTER \x82̕\\x8E\xA6
+ *	UTF-8 \x83f\x83R\x81[\x83h\x82\xA9\x82\xE7\x8Eg\x97p
+ */
 static void PutReplacementChr(VttermKanjiWork *w, const BYTE *ptr, size_t len, BOOL fallback)
 {
 	const char32_t replacement_char = w->replacement_char;
@@ -545,6 +562,7 @@
 	int i;
 	for (i = 0; i < len; i++) {
 		BYTE c = *ptr++;
+		assert(IsC0(c));
 		if (fallback) {
 			// fallback ISO8859-1
 			PutU32(c);
@@ -554,7 +572,7 @@
 			if (c < 0x80) {
 				// \x95s\x90\xB3\x82\xC8UTF-8\x95\xB6\x8E\x9A\x97\xF1\x82̂Ȃ\xA9\x82\xC90x80\x96\xA2\x96\x9E\x82\xAA\x82\xA0\x82\xEA\x82΁A
 				// 1\x95\xB6\x8E\x9A\x82\xCCUTF-8\x95\xB6\x8E\x9A\x82Ƃ\xB5\x82Ă\xBB\x82̂܂ܕ\\x8E\xA6\x82\xB7\x82\xE9
-				ParseASCII(c);
+				PutU32(c);
 			}
 			else {
 				PutU32(replacement_char);
@@ -563,9 +581,11 @@
 	}
 }
 
-// UTF-8\x82Ŏ\xF3\x90M\x83f\x81[\x83^\x82\xF0\x8F\x88\x97\x9D\x82\xB7\x82\xE9
-// returns TRUE if b is processed
-//  (actually allways returns TRUE)
+/**
+ * UTF-8\x82Ŏ\xF3\x90M\x83f\x81[\x83^\x82\xF0\x8F\x88\x97\x9D\x82\xB7\x82\xE9
+ *
+ * returns TRUE if b is processed
+ */
 static BOOL ParseFirstUTF8(BYTE b)
 {
 	VttermKanjiWork *w = &KanjiWork;
@@ -608,18 +628,24 @@
 recheck:
 	// 1byte(7bit)
 	if (w->count == 0) {
-		if (b <= 0x7f) {
-			// 1byte(7bit)
-			//		0x7f\x88ȉ\xBA, \x82̂Ƃ\xAB\x81A\x82\xBB\x82̂܂܏o\x97\xCD
-			ParseASCII(b);
+		if (IsC0(b)) {
+			// U+0000 .. U+001f
+			// C0\x90\xA7\x8C䕶\x8E\x9A, C0 Coontrols
+			ParseControl(b);
 			return TRUE;
 		}
-		if (0xc2 <= b && b <= 0xf4) {
+		else if (b <= 0x7f) {
+			// 0x7f\x88ȉ\xBA, \x82̂Ƃ\xAB\x81A\x82\xBB\x82̂܂܏o\x97\xCD
+			PutU32(b);
+			return TRUE;
+		}
+		else if (0xc2 <= b && b <= 0xf4) {
 			// 1byte\x96ڕۑ\xB6
 			w->buf[w->count++] = b;
 			return TRUE;
 		}
 
+		// 0x80 - 0xc1, 0xf5 - 0xff
 		// UTF-8\x82\xC51byte\x82ɏo\x8C\xBB\x82\xB5\x82Ȃ\xA2\x83R\x81[\x83h\x82̂Ƃ\xAB
 		if (ts.FallbackToCP932) {
 			// fallback\x82\xB7\x82\xE9\x8Fꍇ
@@ -660,7 +686,14 @@
 		if ((w->buf[0] & 0xe0) == 0xc0) {	// == (0xc2 <= w->buf[0] && w->buf[0] <= 0xdf)
 			// 5bit + 6bit
 			code = ((w->buf[0] & 0x1f) << 6) | (b & 0x3f);
-			PutU32(code);
+			if (IsC1(code)) {
+				// U+0080 .. u+009f
+				// C1\x90\xA7\x8C䕶\x8E\x9A, C1 Controls
+				ParseControl((BYTE)code);
+			}
+			else {
+				PutU32(code);
+			}
 			w->count = 0;
 			return TRUE;
 		}
@@ -711,6 +744,10 @@
 static BOOL ParseFirstRus(BYTE b)
 // returns if b is processed
 {
+	if (IsC0(b)) {
+		ParseControl(b);
+		return TRUE;
+	}
 	// CP1251\x82ɕϊ\xB7
 	BYTE c = RussConv(ts.KanjiCode, IdWindows, b);
 	// CP1251->Unicode

Modified: trunk/teraterm/teraterm/vtterm.c
===================================================================
--- trunk/teraterm/teraterm/vtterm.c	2023-06-17 14:47:01 UTC (rev 10769)
+++ trunk/teraterm/teraterm/vtterm.c	2023-06-17 14:47:11 UTC (rev 10770)
@@ -760,17 +760,6 @@
 
 	TCharAttr CharAttrTmp;
 	CharAttrTmp = CharAttr;
-	if (code <= US) {
-		// U+0000 .. U+001f
-		// C0\x90\xA7\x8C䕶\x8E\x9A, C0 Coontrols
-		ParseControl(code);
-		return;
-	} else if ((0x80<=code) && (code<=0x9F)) {
-		// U+0080 .. u+009f
-		// C1\x90\xA7\x8C䕶\x8E\x9A, C1 Controls
-		ParseControl(code);
-		return;
-	}
 
 	{
 		int r;


ttssh2-commit メーリングリストの案内
Back to archive index