summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2022-09-11 21:39:53 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2022-09-11 21:39:53 (GMT)
commit9fd4244e4f77dce5470abdc7d85c9c7d75186b09 (patch)
tree1e5c5a83e04dcd0ae8a1a9345bc200099ebbc586 /generic
parent1b1f3ea6b7141d2f2ef93704c60fc61a40fc597a (diff)
parentfcfbc3a606dd31e90fcc3a6bb847042e19e1722b (diff)
downloadtcl-9fd4244e4f77dce5470abdc7d85c9c7d75186b09.zip
tcl-9fd4244e4f77dce5470abdc7d85c9c7d75186b09.tar.gz
tcl-9fd4244e4f77dce5470abdc7d85c9c7d75186b09.tar.bz2
Fix for [6978c01b65]: Channel encoding difference 8.6 <-> 9.0
Diffstat (limited to 'generic')
-rw-r--r--generic/tclIO.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/generic/tclIO.c b/generic/tclIO.c
index 5313eed..c6402f1 100644
--- a/generic/tclIO.c
+++ b/generic/tclIO.c
@@ -4335,6 +4335,7 @@ Write(
char *nextNewLine = NULL;
int endEncoding, saved = 0, total = 0, flushed = 0, needNlFlush = 0;
char safe[BUFFER_PADDING];
+ int encodingError = 0;
if (srcLen) {
WillWrite(chanPtr);
@@ -4351,7 +4352,7 @@ Write(
nextNewLine = (char *)memchr(src, '\n', srcLen);
}
- while (srcLen + saved + endEncoding > 0) {
+ while (srcLen + saved + endEncoding > 0 && !encodingError) {
ChannelBuffer *bufPtr;
char *dst;
int result, srcRead, dstLen, dstWrote, srcLimit = srcLen;
@@ -4390,6 +4391,19 @@ Write(
statePtr->outputEncodingFlags &= ~TCL_ENCODING_START;
+ /*
+ * See io-75.2, TCL bug 6978c01b65.
+ * Check, if an encoding error occured and should be reported to the
+ * script level.
+ * This happens, if a written character may not be represented by the
+ * current output encoding and strict encoding is active.
+ */
+
+ if (result == TCL_CONVERT_UNKNOWN) {
+ encodingError = 1;
+ result = TCL_OK;
+ }
+
if ((result != TCL_OK) && (srcRead + dstWrote == 0)) {
/*
* We're reading from invalid/incomplete UTF-8.
@@ -4497,6 +4511,10 @@ Write(
UpdateInterest(chanPtr);
+ if (encodingError) {
+ Tcl_SetErrno(EILSEQ);
+ return -1;
+ }
return total;
}