summaryrefslogtreecommitdiffstats
path: root/generic/tclEncoding.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2020-04-22 16:00:36 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2020-04-22 16:00:36 (GMT)
commit04bb9b292c26675655414e30f8257deca1bbe097 (patch)
treebdf676301f26cd0c26f6824b7fae5189505570fb /generic/tclEncoding.c
parent070fa22acbfab9614a41de82797ab8709a43ae36 (diff)
downloadtcl-04bb9b292c26675655414e30f8257deca1bbe097.zip
tcl-04bb9b292c26675655414e30f8257deca1bbe097.tar.gz
tcl-04bb9b292c26675655414e30f8257deca1bbe097.tar.bz2
Attempt to fix [1004065] for TCL_UTF_MAX=4. Disallow building Tcl with TCL_UTF_MAX>4
Diffstat (limited to 'generic/tclEncoding.c')
-rw-r--r--generic/tclEncoding.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/generic/tclEncoding.c b/generic/tclEncoding.c
index 6c16827..d948189 100644
--- a/generic/tclEncoding.c
+++ b/generic/tclEncoding.c
@@ -2359,13 +2359,12 @@ UnicodeToUtfProc(
const char *srcStart, *srcEnd;
char *dstEnd, *dstStart;
int result, numChars;
- Tcl_UniChar ch;
+ unsigned short ch;
result = TCL_OK;
- if ((srcLen % sizeof(Tcl_UniChar)) != 0) {
+ if ((srcLen & 1) != 0) {
result = TCL_CONVERT_MULTIBYTE;
- srcLen /= sizeof(Tcl_UniChar);
- srcLen *= sizeof(Tcl_UniChar);
+ srcLen--;
}
srcStart = src;
@@ -2383,13 +2382,13 @@ UnicodeToUtfProc(
* Special case for 1-byte utf chars for speed. Make sure we
* work with Tcl_UniChar-size data.
*/
- ch = *(Tcl_UniChar *)src;
+ ch = *(unsigned short *)src;
if (ch && ch < 0x80) {
*dst++ = (ch & 0xFF);
} else {
dst += Tcl_UniCharToUtf(ch, dst);
}
- src += sizeof(Tcl_UniChar);
+ src += sizeof(unsigned short);
}
*srcReadPtr = src - srcStart;
@@ -2477,6 +2476,11 @@ UtfToUnicodeProc(
* by casting dst to a Tcl_UniChar. [Bug 1122671]
* XXX: This hard-codes the assumed size of Tcl_UniChar as 2.
*/
+#if TCL_UTF_MAX > 3
+ if (ch & ~0xFFFF) {
+ ch = 0xFFFD;
+ } else
+#endif
#ifdef WORDS_BIGENDIAN
*dst++ = (ch >> 8);
*dst++ = (ch & 0xFF);