Posted to tcl by andreas_kupries at Mon Apr 30 21:36:01 GMT 2007view raw

  1. Index: ChangeLog
  2. ===================================================================
  3. RCS file: /cvsroot/tcl/tcl/ChangeLog,v
  4. retrieving revision 1.3478
  5. diff -w -u -r1.3478 ChangeLog
  6. --- ChangeLog 30 Apr 2007 19:46:01 -0000 1.3478
  7. +++ ChangeLog 30 Apr 2007 21:34:53 -0000
  8. @@ -1,3 +1,10 @@
  9. +2007-04-30 Andreas Kupries <andreask@gactivestate.com>
  10. +
  11. + * generic/tclIO.c (FixLevelCode): Corrected reference count
  12. + mismanagement of newlevel, newcode. Changed to allocate the
  13. + Tcl_Obj's as late as possible, and only when actually needed. [Bug
  14. + 1705778, leak K29].
  15. +
  16. 2007-04-30 Kevin B, Kenny <kennykb@acm.org>
  17.  
  18. * generic/tclProc.c (Tcl_ProcObjCmd, SetLambdaFromAny): Corrected
  19. Index: generic/tclIO.c
  20. ===================================================================
  21. RCS file: /cvsroot/tcl/tcl/generic/tclIO.c,v
  22. retrieving revision 1.118
  23. diff -w -u -r1.118 tclIO.c
  24. --- generic/tclIO.c 20 Apr 2007 05:51:10 -0000 1.118
  25. +++ generic/tclIO.c 30 Apr 2007 21:34:53 -0000
  26. @@ -9962,7 +9962,7 @@
  27. int explicitResult, numOptions, lc, lcn;
  28. Tcl_Obj **lv, **lvn;
  29. int res, i, j, val, lignore, cignore;
  30. - Tcl_Obj *newlevel = NULL, *newcode = NULL;
  31. + int newlevel = -1, newcode = -1;
  32.  
  33. /* ASSERT msg != NULL */
  34.  
  35. @@ -10005,7 +10005,7 @@
  36. res = Tcl_GetIntFromObj(NULL, lv[i+1], &val);
  37. if (((res == TCL_OK) && (val != 1)) || ((res != TCL_OK) &&
  38. (0 != strcmp(TclGetString(lv[i+1]), "error")))) {
  39. - newcode = Tcl_NewIntObj(1);
  40. + newcode = 1;
  41. }
  42. } else if (0 == strcmp(TclGetString(lv[i]), "-level")) {
  43. /*
  44. @@ -10014,7 +10014,7 @@
  45.  
  46. res = Tcl_GetIntFromObj(NULL, lv [i+1], &val);
  47. if ((res != TCL_OK) || (val != 0)) {
  48. - newlevel = Tcl_NewIntObj(0);
  49. + newlevel = 0;
  50. }
  51. }
  52. }
  53. @@ -10023,7 +10023,7 @@
  54. * -code, -level are either not present or ok. Nothing to do.
  55. */
  56.  
  57. - if (!newlevel && !newcode) {
  58. + if ((newlevel < 0) && (newcode < 0)) {
  59. return msg;
  60. }
  61.  
  62. @@ -10031,10 +10031,10 @@
  63. if (explicitResult) {
  64. lcn ++;
  65. }
  66. - if (newlevel) {
  67. + if (newlevel >= 0) {
  68. lcn += 2;
  69. }
  70. - if (newcode) {
  71. + if (newcode >= 0) {
  72. lcn += 2;
  73. }
  74.  
  75. @@ -10050,20 +10050,20 @@
  76. lignore = cignore = 0;
  77. for (i=0, j=0; i<numOptions; i+=2) {
  78. if (0 == strcmp(TclGetString(lv[i]), "-level")) {
  79. - if (newlevel) {
  80. + if (newlevel >= 0) {
  81. lvn[j++] = lv[i];
  82. - lvn[j++] = newlevel;
  83. - newlevel = NULL;
  84. + lvn[j++] = Tcl_NewIntObj(newlevel);
  85. + newlevel = -1;
  86. lignore = 1;
  87. continue;
  88. } else if (lignore) {
  89. continue;
  90. }
  91. } else if (0 == strcmp(TclGetString(lv[i]), "-code")) {
  92. - if (newcode) {
  93. + if (newcode >= 0) {
  94. lvn[j++] = lv[i];
  95. - lvn[j++] = newcode;
  96. - newcode = NULL;
  97. + lvn[j++] = Tcl_NewIntObj (newcode);
  98. + newcode = -1;
  99. cignore = 1;
  100. continue;
  101. } else if (cignore) {
  102. @@ -10078,6 +10078,8 @@
  103. lvn[j++] = lv[i];
  104. lvn[j++] = lv[i+1];
  105. }
  106. + if (newlevel >= 0) {Tcl_Panic ("Defined newlevel not used in rewrite");}
  107. + if (newcode >= 0) {Tcl_Panic ("Defined newcode not used in rewrite");}
  108.  
  109. if (explicitResult) {
  110. lvn[j++] = lv[i];
  111.