diff options
author | dgp <dgp@users.sourceforge.net> | 2014-04-16 17:35:08 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2014-04-16 17:35:08 (GMT) |
commit | 477c964bdc908522a6a802e40b7526f8fe812a73 (patch) | |
tree | dc4a20a2300207f7ea5c269b2526820296e14da9 /generic/tclIO.c | |
parent | 870ed20799fc0d228ffcf6e7add98824b0182950 (diff) | |
parent | c37220bed3a6c2c42a369ca18cf216568a86b1c1 (diff) | |
download | tcl-477c964bdc908522a6a802e40b7526f8fe812a73.zip tcl-477c964bdc908522a6a802e40b7526f8fe812a73.tar.gz tcl-477c964bdc908522a6a802e40b7526f8fe812a73.tar.bz2 |
merge trunk
Diffstat (limited to 'generic/tclIO.c')
-rw-r--r-- | generic/tclIO.c | 51 |
1 files changed, 40 insertions, 11 deletions
diff --git a/generic/tclIO.c b/generic/tclIO.c index be17a07..e4f82be 100644 --- a/generic/tclIO.c +++ b/generic/tclIO.c @@ -3271,7 +3271,17 @@ Tcl_Close( Tcl_SetObjResult(interp, Tcl_NewStringObj(Tcl_PosixError(interp), -1)); } - flushcode = -1; + return TCL_ERROR; + } + /* + * Bug 97069ea11a: set error message if a flush code is set and no error + * message set up to now. + */ + if (flushcode != 0 && interp != NULL + && 0 == Tcl_GetCharLength(Tcl_GetObjResult(interp)) ) { + Tcl_SetErrno(flushcode); + Tcl_SetObjResult(interp, + Tcl_NewStringObj(Tcl_PosixError(interp), -1)); } if ((flushcode != 0) || (result != 0)) { return TCL_ERROR; @@ -4260,6 +4270,7 @@ Tcl_GetsObj( */ chanPtr = statePtr->topChanPtr; + Tcl_Preserve(chanPtr); bufPtr = statePtr->inQueueHead; encoding = statePtr->encoding; @@ -4492,8 +4503,9 @@ Tcl_GetsObj( * Regenerate the top channel, in case it was changed due to * self-modifying reflected transforms. */ - + /* chanPtr = statePtr->topChanPtr; + */ bufPtr = gs.bufPtr; if (bufPtr == NULL) { @@ -4527,9 +4539,9 @@ Tcl_GetsObj( * Regenerate the top channel, in case it was changed due to * self-modifying reflected transforms. */ - + /* chanPtr = statePtr->topChanPtr; - + */ bufPtr = statePtr->inQueueHead; if (bufPtr == NULL) { Tcl_Panic("Tcl_GetsObj: restore reached with bufPtr==NULL"); @@ -4569,10 +4581,11 @@ Tcl_GetsObj( * Regenerate the top channel, in case it was changed due to * self-modifying reflected transforms. */ - + /* chanPtr = statePtr->topChanPtr; - + */ UpdateInterest(chanPtr); + Tcl_Release(chanPtr); return copiedTotal; } @@ -4618,6 +4631,7 @@ TclGetsObjBinary( */ chanPtr = statePtr->topChanPtr; + Tcl_Preserve(chanPtr); bufPtr = statePtr->inQueueHead; @@ -4821,6 +4835,7 @@ TclGetsObjBinary( done: UpdateInterest(chanPtr); + Tcl_Release(chanPtr); return copiedTotal; } @@ -5292,6 +5307,7 @@ Tcl_ReadRaw( * requests more bytes. */ + Tcl_Preserve(chanPtr); for (copied = 0; copied < bytesToRead; copied += copiedNow) { copiedNow = CopyBuffer(chanPtr, bufPtr + copied, bytesToRead - copied); @@ -5342,7 +5358,7 @@ Tcl_ReadRaw( * over EAGAIN/WOULDBLOCK handling. */ - return copied; + goto done; } SetFlag(statePtr, CHANNEL_BLOCKED); @@ -5350,14 +5366,17 @@ Tcl_ReadRaw( } Tcl_SetErrno(result); - return -1; + copied = -1; + goto done; } - return copied + nread; + copied += nread; + goto done; } } done: + Tcl_Release(chanPtr); return copied; } @@ -5466,6 +5485,7 @@ DoReadChars( chanPtr = statePtr->topChanPtr; encoding = statePtr->encoding; factor = UTF_EXPANSION_FACTOR; + Tcl_Preserve(chanPtr); binaryMode = (encoding == NULL) && (statePtr->inputTranslation == TCL_TRANSLATE_LF) @@ -5550,10 +5570,11 @@ DoReadChars( * Regenerate the top channel, in case it was changed due to * self-modifying reflected transforms. */ - + /* chanPtr = statePtr->topChanPtr; - + */ UpdateInterest(chanPtr); + Tcl_Release(chanPtr); return copied; } @@ -8001,6 +8022,11 @@ UpdateInterest( /* State info for channel */ int mask = statePtr->interestMask; + if (chanPtr->typePtr == NULL) { + /* Do not update interest on a closed channel */ + return; + } + /* * If there are flushed buffers waiting to be written, then we need to * watch for the channel to become writable. @@ -9083,6 +9109,7 @@ DoRead( ChannelState *statePtr = chanPtr->state; char *p = dst; + Tcl_Preserve(chanPtr); while (bytesToRead) { /* * Each pass through the loop is intended to process up to @@ -9122,6 +9149,7 @@ DoRead( if (code) { /* Read error */ UpdateInterest(chanPtr); + Tcl_Release(chanPtr); return -1; } @@ -9216,6 +9244,7 @@ DoRead( } } + Tcl_Release(chanPtr); return (int)(p - dst); } |