diff options
author | dgp <dgp@noemail.net> | 2014-11-11 22:23:57 (GMT) |
---|---|---|
committer | dgp <dgp@noemail.net> | 2014-11-11 22:23:57 (GMT) |
commit | af846dce715dacbaa1f6aaf03b86a2d8035caf73 (patch) | |
tree | 52d1730311d967e3dab01ad7376b082bbb0321e4 /generic | |
parent | 1a5dc37041bb2719b34b7e701b2a663fa4909755 (diff) | |
download | tcl-core-8-6-3.zip tcl-core-8-6-3.tar.gz tcl-core-8-6-3.tar.bz2 |
Likely fix for channel mem leaks.core-8-6-3
FossilOrigin-Name: 450a131ee70336913b3ec1fd0e80f6e9efd0d78c
Diffstat (limited to 'generic')
-rw-r--r-- | generic/tclIO.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/generic/tclIO.c b/generic/tclIO.c index 8ec2a1e..2025742 100644 --- a/generic/tclIO.c +++ b/generic/tclIO.c @@ -155,6 +155,7 @@ static ChannelBuffer * AllocChannelBuffer(int length); static void PreserveChannelBuffer(ChannelBuffer *bufPtr); static void ReleaseChannelBuffer(ChannelBuffer *bufPtr); static int IsShared(ChannelBuffer *bufPtr); +static void ChannelFree(Channel *chanPtr); static void ChannelTimerProc(ClientData clientData); static int ChanRead(Channel *chanPtr, char *dst, int dstSize); static int CheckChannelErrors(ChannelState *statePtr, @@ -1914,6 +1915,16 @@ TclChannelRelease( } } +static void +ChannelFree( + Channel *chanPtr) +{ + if (chanPtr->refCount == 0) { + ckfree(chanPtr); + return; + } + chanPtr->typePtr = NULL; +} /* *---------------------------------------------------------------------- @@ -2060,7 +2071,7 @@ Tcl_UnstackChannel( */ result = ChanClose(chanPtr, interp); - chanPtr->typePtr = NULL; + ChannelFree(chanPtr); UpdateInterest(statePtr->topChanPtr); @@ -3018,7 +3029,8 @@ CloseChannel( statePtr->topChanPtr = downChanPtr; downChanPtr->upChanPtr = NULL; - chanPtr->typePtr = NULL; + + ChannelFree(chanPtr); return Tcl_Close(interp, (Tcl_Channel) downChanPtr); } @@ -3029,7 +3041,7 @@ CloseChannel( * stack, make sure to free the ChannelState structure associated with it. */ - chanPtr->typePtr = NULL; + ChannelFree(chanPtr); Tcl_EventuallyFree(statePtr, TCL_DYNAMIC); |