diff options
| author | apnadkarni <apnmbx-wits@yahoo.com> | 2024-05-17 11:48:53 (GMT) |
|---|---|---|
| committer | apnadkarni <apnmbx-wits@yahoo.com> | 2024-05-17 11:48:53 (GMT) |
| commit | 34edafeda77ffaa24279ae1d0343181a091a484d (patch) | |
| tree | 0d8d9c626dd00be1b0171e24139d2916a1cdb58e /generic/tclIO.c | |
| parent | 48e5573a790af82c0fdb087b42883536157739d4 (diff) | |
| download | tcl-34edafeda77ffaa24279ae1d0343181a091a484d.zip tcl-34edafeda77ffaa24279ae1d0343181a091a484d.tar.gz tcl-34edafeda77ffaa24279ae1d0343181a091a484d.tar.bz2 | |
Free ChannelState.chanMsg .unreportedMsg
Diffstat (limited to 'generic/tclIO.c')
| -rw-r--r-- | generic/tclIO.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/generic/tclIO.c b/generic/tclIO.c index 2df8696..adcf513 100644 --- a/generic/tclIO.c +++ b/generic/tclIO.c @@ -157,7 +157,8 @@ typedef struct CloseCallback { static ChannelBuffer * AllocChannelBuffer(int length); static void PreserveChannelBuffer(ChannelBuffer *bufPtr); static void ReleaseChannelBuffer(ChannelBuffer *bufPtr); -static int IsShared(ChannelBuffer *bufPtr); +static void FreeChannelState(char *blockPtr); +static int IsShared(ChannelBuffer *bufPtr); static void ChannelFree(Channel *chanPtr); static void ChannelTimerProc(void *clientData); static int ChanRead(Channel *chanPtr, char *dst, int dstSize); @@ -2949,6 +2950,23 @@ FlushChannel( return errorCode; } +static void FreeChannelState(char *blockPtr) +{ + ChannelState *statePtr = (ChannelState *)blockPtr; + /* + * Bug [79474c588] leak. Possible other fields need freeing but + * not clear if they are already freed and if the fields are set to NULL + * when they are. Test suite shows no other leaks at the moment. + */ + if (statePtr->chanMsg) { + Tcl_DecrRefCount(statePtr->chanMsg); + } + if (statePtr->unreportedMsg) { + Tcl_DecrRefCount(statePtr->unreportedMsg); + } + ckfree(statePtr); +} + /* *---------------------------------------------------------------------- * @@ -3125,7 +3143,7 @@ CloseChannel( ChannelFree(chanPtr); - Tcl_EventuallyFree(statePtr, TCL_DYNAMIC); + Tcl_EventuallyFree(statePtr, FreeChannelState); return errorCode; } |
