diff options
author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2012-12-27 15:05:28 (GMT) |
---|---|---|
committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2012-12-27 15:05:28 (GMT) |
commit | 25684743a9629d0b8645c505a6856cc7e2bc9180 (patch) | |
tree | 50404fb0a39698c9462bd2ceee8c74c909f28a20 | |
parent | 4a9549053c5065a1fd09b601851548e7418967c0 (diff) | |
parent | 3179079214bd7ec9eecf26f71b91ea8d5c7308d1 (diff) | |
download | tcl-25684743a9629d0b8645c505a6856cc7e2bc9180.zip tcl-25684743a9629d0b8645c505a6856cc7e2bc9180.tar.gz tcl-25684743a9629d0b8645c505a6856cc7e2bc9180.tar.bz2 |
merge trunk
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | compat/dirent2.h | 2 | ||||
-rw-r--r-- | compat/dlfcn.h | 2 | ||||
-rw-r--r-- | compat/string.h | 2 | ||||
-rw-r--r-- | compat/unistd.h | 1 | ||||
-rw-r--r-- | generic/tclListObj.c | 9 | ||||
-rw-r--r-- | generic/tclUtil.c | 18 |
7 files changed, 25 insertions, 19 deletions
@@ -1,3 +1,13 @@ +2012-12-27 Jan Nijtmans <nijtmans@users.sf.net> + + * generic/tclListObj.c: [Bug 3598580]: Tcl_ListObjReplace may release + deleted elements too early + +2012-12-22 Alexandre Ferrieux <ferrieux@users.sourceforge.net> + + * generic/tclUtil.c: Stop leaking allocated space when objifying a + zero-length DString. [Bug 3598150] spotted by afredd. + 2012-12-21 Jan Nijtmans <nijtmans@users.sf.net> * unix/dltest/pkgb.c: Inline compat Tcl_GetDefaultEncodingDir. diff --git a/compat/dirent2.h b/compat/dirent2.h index 878457f..5be08ba 100644 --- a/compat/dirent2.h +++ b/compat/dirent2.h @@ -14,8 +14,6 @@ #ifndef _DIRENT #define _DIRENT -#include "tcl.h" - /* * Dirent structure, which holds information about a single * directory entry. diff --git a/compat/dlfcn.h b/compat/dlfcn.h index 6940c2a..fb27ea0 100644 --- a/compat/dlfcn.h +++ b/compat/dlfcn.h @@ -26,8 +26,6 @@ #ifndef __dlfcn_h__ #define __dlfcn_h__ -#include "tcl.h" - #ifdef __cplusplus extern "C" { #endif diff --git a/compat/string.h b/compat/string.h index 84ee094..42be10c 100644 --- a/compat/string.h +++ b/compat/string.h @@ -13,8 +13,6 @@ #ifndef _STRING #define _STRING -#include "tcl.h" - /* * The following #include is needed to define size_t. (This used to include * sys/stdtypes.h but that doesn't exist on older versions of SunOS, e.g. diff --git a/compat/unistd.h b/compat/unistd.h index 6779e74..2de5bd0 100644 --- a/compat/unistd.h +++ b/compat/unistd.h @@ -14,7 +14,6 @@ #ifndef _UNISTD #define _UNISTD -#include "tcl.h" #include <sys/types.h> #ifndef NULL diff --git a/generic/tclListObj.c b/generic/tclListObj.c index 3668b45..53c3f66 100644 --- a/generic/tclListObj.c +++ b/generic/tclListObj.c @@ -909,6 +909,10 @@ Tcl_ListObjReplace( isShared = (listRepPtr->refCount > 1); numRequired = numElems - count + objc; + for (i = 0; i < objc; i++) { + Tcl_IncrRefCount(objv[i]); + } + if ((numRequired <= listRepPtr->maxElemCount) && !isShared) { int shift; @@ -1027,14 +1031,11 @@ Tcl_ListObjReplace( } /* - * Insert the new elements into elemPtrs before "first". We don't do a - * memcpy here because we must increment the reference counts for the - * added elements, so we must explicitly loop anyway. + * Insert the new elements into elemPtrs before "first". */ for (i=0,j=first ; i<objc ; i++,j++) { elemPtrs[j] = objv[i]; - Tcl_IncrRefCount(objv[i]); } /* diff --git a/generic/tclUtil.c b/generic/tclUtil.c index 4b69628..c8f73da 100644 --- a/generic/tclUtil.c +++ b/generic/tclUtil.c @@ -2827,14 +2827,16 @@ TclDStringToObj( { Tcl_Obj *result; - if (dsPtr->length == 0) { - TclNewObj(result); - } else if (dsPtr->string == dsPtr->staticSpace) { - /* - * Static buffer, so must copy. - */ - - TclNewStringObj(result, dsPtr->string, dsPtr->length); + if (dsPtr->string == dsPtr->staticSpace) { + if (dsPtr->length == 0) { + TclNewObj(result); + } else { + /* + * Static buffer, so must copy. + */ + + TclNewStringObj(result, dsPtr->string, dsPtr->length); + } } else { /* * Dynamic buffer, so transfer ownership and reset. |