diff options
| author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2019-03-02 16:04:59 (GMT) |
|---|---|---|
| committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2019-03-02 16:04:59 (GMT) |
| commit | bfaca509637e46e0ffd48c20a60b78c617c7bf44 (patch) | |
| tree | 4a8907259172a0e3fb26c1592c5f5a9c9169d90c /generic/tclStringObj.c | |
| parent | cc3041cee0463eae2d11f0125f3921b66f67497a (diff) | |
| download | tcl-bfaca509637e46e0ffd48c20a60b78c617c7bf44.zip tcl-bfaca509637e46e0ffd48c20a60b78c617c7bf44.tar.gz tcl-bfaca509637e46e0ffd48c20a60b78c617c7bf44.tar.bz2 | |
Backport [bd94500678e837d7] from 8.7, preventing endless loops in UTF-8 conversions when handling surrogates. Only effective when compiling with -DTCL_UTF_MAX=4|6 (default: 3). Meant for benefit of Androwish.
Diffstat (limited to 'generic/tclStringObj.c')
| -rw-r--r-- | generic/tclStringObj.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/generic/tclStringObj.c b/generic/tclStringObj.c index 72e4a3d..46bd1c1 100644 --- a/generic/tclStringObj.c +++ b/generic/tclStringObj.c @@ -2002,9 +2002,9 @@ Tcl_AppendFormatToObj( } length = Tcl_UniCharToUtf(code, buf); #if TCL_UTF_MAX > 3 - if (!length) { + if ((code >= 0xD800) && (length < 3)) { /* Special case for handling high surrogates. */ - length = Tcl_UniCharToUtf(-1, buf); + length += Tcl_UniCharToUtf(-1, buf + length); } #endif segment = Tcl_NewStringObj(buf, length); @@ -3176,7 +3176,7 @@ ExtendStringRepWithUnicode( copyBytes: dst = objPtr->bytes + origLength; for (i = 0; i < numChars; i++) { - dst += Tcl_UniCharToUtf((int) unicode[i], dst); + dst += Tcl_UniCharToUtf(unicode[i], dst); } *dst = '\0'; objPtr->length = dst - objPtr->bytes; |
