diff options
author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2022-11-23 15:21:29 (GMT) |
---|---|---|
committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2022-11-23 15:21:29 (GMT) |
commit | d8dac38437604bf1c0e6ae5126069ca094edee37 (patch) | |
tree | b6706f962f43deaa4ed4be2e42ef4849a62332a9 /generic/tclIO.c | |
parent | 52aada907a982dce6c92af04597de68b0e2737ba (diff) | |
download | tcl-d8dac38437604bf1c0e6ae5126069ca094edee37.zip tcl-d8dac38437604bf1c0e6ae5126069ca094edee37.tar.gz tcl-d8dac38437604bf1c0e6ae5126069ca094edee37.tar.bz2 |
Proposed fix for [da63e4c1e]. First version, not 100% as expected yet.
Diffstat (limited to 'generic/tclIO.c')
-rw-r--r-- | generic/tclIO.c | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/generic/tclIO.c b/generic/tclIO.c index b7cfb45..f20a387 100644 --- a/generic/tclIO.c +++ b/generic/tclIO.c @@ -4149,13 +4149,13 @@ Tcl_WriteChars( Tcl_Channel chan, /* The channel to buffer output for. */ const char *src, /* UTF-8 characters to queue in output * buffer. */ - size_t len) /* Length of string in bytes, or -1 for + size_t len) /* Length of string in bytes, or TCL_INDEX_NONE for * strlen(). */ { Channel *chanPtr = (Channel *) chan; ChannelState *statePtr = chanPtr->state; /* State info for channel */ - int result; - Tcl_Obj *objPtr, *copy; + size_t result; + Tcl_Obj *objPtr; if (CheckChannelErrors(statePtr, TCL_WRITABLE) != 0) { return TCL_INDEX_NONE; @@ -4182,11 +4182,15 @@ Tcl_WriteChars( } objPtr = Tcl_NewStringObj(src, len); - copy = TclNarrowToBytes(objPtr); - src = (char *) Tcl_GetByteArrayFromObj(copy, &len); + Tcl_IncrRefCount(objPtr); + src = (char *) Tcl_GetByteArrayFromObj(objPtr, &len); + if (src == NULL) { + Tcl_SetErrno(EILSEQ); + result = TCL_INDEX_NONE; + } else { + result = WriteBytes(chanPtr, src, len); + } TclDecrRefCount(objPtr); - result = WriteBytes(chanPtr, src, len); - TclDecrRefCount(copy); return result; } @@ -4205,8 +4209,8 @@ Tcl_WriteChars( * line buffering mode. * * Results: - * The number of bytes written or -1 in case of error. If -1, - * Tcl_GetErrno() will return the error code. + * The number of bytes written or TCL_INDEX_NONE in case of error. If + * TCL_INDEX_NONE, Tcl_GetErrno() will return the error code. * * Side effects: * May buffer up output and may cause output to be produced on the @@ -4236,12 +4240,15 @@ Tcl_WriteObj( return TCL_INDEX_NONE; } if (statePtr->encoding == NULL) { - int result; - Tcl_Obj *copy = TclNarrowToBytes(objPtr); + size_t result; - src = (char *) Tcl_GetByteArrayFromObj(copy, &srcLen); - result = WriteBytes(chanPtr, src, srcLen); - Tcl_DecrRefCount(copy); + src = (char *) Tcl_GetByteArrayFromObj(objPtr, &srcLen); + if (src == NULL) { + Tcl_SetErrno(EILSEQ); + result = TCL_INDEX_NONE; + } else { + result = WriteBytes(chanPtr, src, srcLen); + } return result; } else { src = Tcl_GetStringFromObj(objPtr, &srcLen); |