diff options
| author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2020-04-22 16:00:36 (GMT) |
|---|---|---|
| committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2020-04-22 16:00:36 (GMT) |
| commit | 04bb9b292c26675655414e30f8257deca1bbe097 (patch) | |
| tree | bdf676301f26cd0c26f6824b7fae5189505570fb /generic/tclEncoding.c | |
| parent | 070fa22acbfab9614a41de82797ab8709a43ae36 (diff) | |
| download | tcl-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.c | 16 |
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); |
