Tcl Source Code

View Ticket
Login
Ticket UUID: 736421
Title: memory leak in TclUnsetEnv
Type: Bug Version: None
Submitter: mistachkin Created on: 2003-05-12 11:18:11
Subsystem: 08. Environment Variables Assigned To: davygrvy
Priority: 9 Immediate Severity:
Status: Closed Last Modified: 2003-05-15 00:19:54
Resolution: Fixed Closed By: hobbs
    Closed on: 2003-05-14 17:19:54
Description:
generic/tclEnv.c, line #418:

string = ckrealloc(string, (unsigned) 
(Tcl_DStringLength(&envString)+1));

This is a local variable which has memory allocated 
to it and the memory is never freed.  This is a 
repeatable leak.
User Comments: hobbs added on 2003-05-15 00:19:54:
Logged In: YES 
user_id=72656

I've commited to 8-4-branch.

mistachkin added on 2003-05-14 15:02:33:
Logged In: YES 
user_id=113501

Could you please commit this change to the core-8-4-
branch as well?

Thanks.

davygrvy added on 2003-05-14 13:15:33:
Logged In: YES 
user_id=7549

excellent news.  committed (fixed) patch.

mistachkin added on 2003-05-14 11:27:32:

File Added - 50297: env.diff.zip

Logged In: YES 
user_id=113501

davygrvy's patch fixes the leak here.  However, there is 
a typo in the patch, ckfree(p) should be ckfree(string).

Attaching new patch.

mistachkin added on 2003-05-14 11:05:22:
Logged In: YES 
user_id=113501

Simplified test case:

foreach name [array names env] { set env2($name) $env
($name); unset env($name) }

Produces the following leaks (will be different on your 
machine):

  a76328 -   a7633d       22 @ ..\generic\tclEnv.c 418 
  a724a0 -   a724a4        5 @ ..\generic\tclEnv.c 418 
  a72420 -   a72427        8 @ ..\generic\tclEnv.c 418 
  a762a8 -   a762b4       13 @ ..\generic\tclEnv.c 418 
  a723e0 -   a723e9       10 @ ..\generic\tclEnv.c 418 
  a72320 -   a72328        9 @ ..\generic\tclEnv.c 418 
  a723a0 -   a723a5        6 @ ..\generic\tclEnv.c 418 
  a72360 -   a72365        6 @ ..\generic\tclEnv.c 418 
  a722e0 -   a722e7        8 @ ..\generic\tclEnv.c 418 
  a72260 -   a7226a       11 @ ..\generic\tclEnv.c 418 
  a722a0 -   a722a3        4 @ ..\generic\tclEnv.c 418 
  a76228 -   a7623f       24 @ ..\generic\tclEnv.c 418 
  a721e0 -   a721e7        8 @ ..\generic\tclEnv.c 418 
  a76128 -   a76133       12 @ ..\generic\tclEnv.c 418 
  a76028 -   a76033       12 @ ..\generic\tclEnv.c 418 
  a72220 -   a72224        5 @ ..\generic\tclEnv.c 418 
  a721a0 -   a721a8        9 @ ..\generic\tclEnv.c 418 
  a760a8 -   a760b5       14 @ ..\generic\tclEnv.c 418 
  a75ea8 -   a75eb3       12 @ ..\generic\tclEnv.c 418 
  a72160 -   a72169       10 @ ..\generic\tclEnv.c 418 
  a75fa8 -   a75fb4       13 @ ..\generic\tclEnv.c 418 
  a75f28 -   a75f38       17 @ ..\generic\tclEnv.c 418 
  a75e28 -   a75e33       12 @ ..\generic\tclEnv.c 418 
  a75da8 -   a75db4       13 @ ..\generic\tclEnv.c 418 
  a72120 -   a72128        9 @ ..\generic\tclEnv.c 418 
  a75d28 -   a75d3b       20 @ ..\generic\tclEnv.c 418 
  a720e0 -   a720e9       10 @ ..\generic\tclEnv.c 418 
  a720a0 -   a720a8        9 @ ..\generic\tclEnv.c 418 
  a72060 -   a7206a       11 @ ..\generic\tclEnv.c 418 
  a75ca8 -   a75cba       19 @ ..\generic\tclEnv.c 418 
  a72020 -   a72028        9 @ ..\generic\tclEnv.c 418 
  a75c28 -   a75c3d       22 @ ..\generic\tclEnv.c 418 
  a71fa0 -   a71fa7        8 @ ..\generic\tclEnv.c 418 
  a71fe0 -   a71fe5        6 @ ..\generic\tclEnv.c 418

mistachkin added on 2003-05-14 10:23:50:

File Added - 50294: memory.leak

Logged In: YES 
user_id=113501

Ok, here are the exact steps I use to duplicate this leak:

tclsh85tg
% memory onexit <your leak file here>
% rename exit ""
% package require tcltest
% source env.test
% close stdin

NOTE: You can do the "source env.test" several times for 
dramatic effect.

mistachkin added on 2003-05-14 10:17:36:
Logged In: YES 
user_id=113501

This bug may be observed on Windows by running the 
test suite in tclsh with memory debuggin enabled.

davygrvy added on 2003-05-14 07:07:21:
Logged In: YES 
user_id=7549

Yet another tclEnv issue.


Index: tclEnv.c
=============================================
======================
RCS file: /cvsroot/tcl/tcl/generic/tclEnv.c,v
retrieving revision 1.20
diff -c -r1.20 tclEnv.c
*** tclEnv.c14 Jan 2003 02:06:11 -00001.20
--- tclEnv.c14 May 2003 00:05:22 -0000
***************
*** 429,434 ****
--- 429,439 ----
  
      if (environ[index] == string) {
  ReplaceString(oldValue, string);
+ #ifdef HAVE_PUTENV_THAT_COPIES
+     } else {
+ /* This putenv() copies instead of taking ownership 
*/
+ ckfree(p);
+ #endif
      }
  #else
      for (envPtr = environ+index+1; ; envPtr++) {


Untested..  Need exercising script.

hobbs added on 2003-05-14 06:09:55:
Logged In: YES 
user_id=72656

There is a ifdef HAVE_PUTENV_THAT_COPIES that I 
thought addressed this.  How can I exercise this bug in a 
script?

Attachments: