Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Free ChannelState.chanMsg .unreportedMsg |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | apn-channelstate-leak |
Files: | files | file ages | folders |
SHA3-256: |
f37f5aac4cc9471b9dd6aa5e52e66b58 |
User & Date: | apnadkarni 2024-05-17 11:48:53 |
Context
2024-05-17
| ||
12:57 | merge apn-channelstate-leak, fixes possible leaks on several members that may be set after the close... check-in: f41c1304d5 user: sebres tags: fix-79474c58800cdf94 | |
11:48 | Free ChannelState.chanMsg .unreportedMsg Closed-Leaf check-in: f37f5aac4c user: apnadkarni tags: apn-channelstate-leak | |
2024-05-16
| ||
20:28 | fix mem-leak originating by cyclic reference `rcPtr->name (type "channel", its refCount may be large... check-in: 47cb98a686 user: sebres tags: fix-79474c58800cdf94 | |
Changes
Changes to generic/tclIO.c.
︙ | ︙ | |||
153 154 155 156 157 158 159 | /* * Static functions in this file: */ static ChannelBuffer * AllocChannelBuffer(int length); static void PreserveChannelBuffer(ChannelBuffer *bufPtr); static void ReleaseChannelBuffer(ChannelBuffer *bufPtr); | > | | 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 | /* * Static functions in this file: */ static ChannelBuffer * AllocChannelBuffer(int length); static void PreserveChannelBuffer(ChannelBuffer *bufPtr); static void ReleaseChannelBuffer(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); static int CheckChannelErrors(ChannelState *statePtr, int direction); static int CheckForDeadChannel(Tcl_Interp *interp, ChannelState *statePtr); |
︙ | ︙ | |||
2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 | goto done; } done: TclChannelRelease((Tcl_Channel)chanPtr); return errorCode; } /* *---------------------------------------------------------------------- * * CloseChannel -- * * Utility procedure to close a channel and free associated resources. | > > > > > > > > > > > > > > > > > | 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 | goto done; } done: TclChannelRelease((Tcl_Channel)chanPtr); 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); } /* *---------------------------------------------------------------------- * * CloseChannel -- * * Utility procedure to close a channel and free associated resources. |
︙ | ︙ | |||
3121 3122 3123 3124 3125 3126 3127 | * There is only the TOP Channel, so we free the remaining pointers we * have and then ourselves. Since this is the last of the channels in the * stack, make sure to free the ChannelState structure associated with it. */ ChannelFree(chanPtr); | | | 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 | * There is only the TOP Channel, so we free the remaining pointers we * have and then ourselves. Since this is the last of the channels in the * stack, make sure to free the ChannelState structure associated with it. */ ChannelFree(chanPtr); Tcl_EventuallyFree(statePtr, FreeChannelState); return errorCode; } /* *---------------------------------------------------------------------- * |
︙ | ︙ |