summaryrefslogtreecommitdiffstats
path: root/generic/tclEncoding.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2021-04-01 09:47:33 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2021-04-01 09:47:33 (GMT)
commite5991250e0ed04102d22556452ad154fac8bf7d6 (patch)
treeb81cea0fe9513e6fadef70f936e761e2fc9d4bb7 /generic/tclEncoding.c
parent73953be8b1584077829153afd6a58d2965e9f60c (diff)
downloadtcl-e5991250e0ed04102d22556452ad154fac8bf7d6.zip
tcl-e5991250e0ed04102d22556452ad154fac8bf7d6.tar.gz
tcl-e5991250e0ed04102d22556452ad154fac8bf7d6.tar.bz2
Follow-up to [15c7b4f93e]: "Implement TCL_ENCODING_STOPONERROR flag for UtfToUtf encoder/decoder". Only do this check when pureNullMode == 0, otherwise we violate EIAS.
Diffstat (limited to 'generic/tclEncoding.c')
-rw-r--r--generic/tclEncoding.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/generic/tclEncoding.c b/generic/tclEncoding.c
index 1536f98..686eeb5 100644
--- a/generic/tclEncoding.c
+++ b/generic/tclEncoding.c
@@ -2322,7 +2322,7 @@ UtfToUtfProc(
result = TCL_CONVERT_NOSPACE;
break;
}
- if (UCHAR(*src) < 0x80 && !(UCHAR(*src) == 0 && pureNullMode == 0)) {
+ if (UCHAR(*src) < 0x80 && !((UCHAR(*src) == 0) && (pureNullMode == 0))) {
/*
* Copy 7bit characters, but skip null-bytes when we are in input
* mode, so that they get converted to 0xC080.
@@ -2330,8 +2330,8 @@ UtfToUtfProc(
*dst++ = *src++;
*chPtr = 0; /* reset surrogate handling */
- } else if (pureNullMode == 1 && UCHAR(*src) == 0xC0 &&
- (src + 1 < srcEnd) && UCHAR(*(src+1)) == 0x80) {
+ } else if ((UCHAR(*src) == 0xC0) && (src + 1 < srcEnd)
+ && (UCHAR(src[1]) == 0x80) && (pureNullMode == 1)) {
/*
* Convert 0xC080 to real nulls when we are in output mode.
*/
@@ -2347,7 +2347,7 @@ UtfToUtfProc(
* unless the user has explicitly asked to be told.
*/
- if (flags & TCL_ENCODING_STOPONERROR) {
+ if ((flags & TCL_ENCODING_STOPONERROR) && (pureNullMode == 0)) {
result = TCL_CONVERT_MULTIBYTE;
break;
}
@@ -2356,8 +2356,8 @@ UtfToUtfProc(
dst += Tcl_UniCharToUtf(*chPtr, dst);
} else {
size_t len = TclUtfToUniChar(src, chPtr);
- if ((len < 2) && (flags & TCL_ENCODING_STOPONERROR) && (*chPtr != 0)
- && ((*chPtr & ~0x7FF) != 0xD800)) {
+ if ((len < 2) && (*chPtr != 0) && (flags & TCL_ENCODING_STOPONERROR)
+ && ((*chPtr & ~0x7FF) != 0xD800) && (pureNullMode == 0)) {
result = TCL_CONVERT_SYNTAX;
break;
}