summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2024-04-22 16:19:13 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2024-04-22 16:19:13 (GMT)
commitaf5dea2fa5e46b709e170f568e91b87eea7f1316 (patch)
tree8d98b15681500e2e5f30f3ed399d543a7d3d367f
parentfce856a1084d7f8d4f52f280098a52e1e1296812 (diff)
parent625601df98d11322892eace36f9181a7c67364c4 (diff)
downloadtcl-af5dea2fa5e46b709e170f568e91b87eea7f1316.zip
tcl-af5dea2fa5e46b709e170f568e91b87eea7f1316.tar.gz
tcl-af5dea2fa5e46b709e170f568e91b87eea7f1316.tar.bz2
Fix [6eb8d79cb8]: segfault in obj-34.1
-rw-r--r--generic/tcl.decls2
-rw-r--r--generic/tclDecls.h4
-rw-r--r--generic/tclInterp.c118
-rw-r--r--generic/tclTestObj.c3
4 files changed, 66 insertions, 61 deletions
diff --git a/generic/tcl.decls b/generic/tcl.decls
index 34f5af1..2ffa808 100644
--- a/generic/tcl.decls
+++ b/generic/tcl.decls
@@ -536,7 +536,7 @@ declare 148 {deprecated {Use Tcl_GetAliasObj}} {
declare 149 {
int Tcl_GetAliasObj(Tcl_Interp *interp, const char *childCmd,
Tcl_Interp **targetInterpPtr, const char **targetCmdPtr,
- int *objcPtr, Tcl_Obj ***objv)
+ int *objcPtr, Tcl_Obj ***objvPtr)
}
declare 150 {
void *Tcl_GetAssocData(Tcl_Interp *interp, const char *name,
diff --git a/generic/tclDecls.h b/generic/tclDecls.h
index 29b96b0..357bb7c 100644
--- a/generic/tclDecls.h
+++ b/generic/tclDecls.h
@@ -500,7 +500,7 @@ EXTERN int Tcl_GetAliasObj(Tcl_Interp *interp,
const char *childCmd,
Tcl_Interp **targetInterpPtr,
const char **targetCmdPtr, int *objcPtr,
- Tcl_Obj ***objv);
+ Tcl_Obj ***objvPtr);
/* 150 */
EXTERN void * Tcl_GetAssocData(Tcl_Interp *interp,
const char *name,
@@ -2201,7 +2201,7 @@ typedef struct TclStubs {
int (*tcl_Flush) (Tcl_Channel chan); /* 146 */
TCL_DEPRECATED_API("see TIP #559. Use Tcl_ResetResult") void (*tcl_FreeResult) (Tcl_Interp *interp); /* 147 */
TCL_DEPRECATED_API("Use Tcl_GetAliasObj") int (*tcl_GetAlias) (Tcl_Interp *interp, const char *childCmd, Tcl_Interp **targetInterpPtr, const char **targetCmdPtr, int *argcPtr, const char ***argvPtr); /* 148 */
- int (*tcl_GetAliasObj) (Tcl_Interp *interp, const char *childCmd, Tcl_Interp **targetInterpPtr, const char **targetCmdPtr, int *objcPtr, Tcl_Obj ***objv); /* 149 */
+ int (*tcl_GetAliasObj) (Tcl_Interp *interp, const char *childCmd, Tcl_Interp **targetInterpPtr, const char **targetCmdPtr, int *objcPtr, Tcl_Obj ***objvPtr); /* 149 */
void * (*tcl_GetAssocData) (Tcl_Interp *interp, const char *name, Tcl_InterpDeleteProc **procPtr); /* 150 */
Tcl_Channel (*tcl_GetChannel) (Tcl_Interp *interp, const char *chanName, int *modePtr); /* 151 */
Tcl_Size (*tcl_GetChannelBufferSize) (Tcl_Channel chan); /* 152 */
diff --git a/generic/tclInterp.c b/generic/tclInterp.c
index 104899c..a98216c 100644
--- a/generic/tclInterp.c
+++ b/generic/tclInterp.c
@@ -12,7 +12,6 @@
*/
#include "tclInt.h"
-#include <assert.h>
/*
* A pointer to a string that holds an initialization script that if non-NULL
@@ -26,14 +25,14 @@ static const char *tclPreInitScript = NULL;
struct Target;
/*
- * struct Alias:
+ * Alias:
*
* Stores information about an alias. Is stored in the child interpreter and
* used by the source command to find the target command in the parent when
* the source command is invoked.
*/
-typedef struct Alias {
+typedef struct {
Tcl_Obj *token; /* Token for the alias command in the child
* interp. This used to be the command name in
* the child when the alias was first
@@ -52,7 +51,7 @@ typedef struct Alias {
* used in the parent interpreter to map back
* from the target command to aliases
* redirecting to it. */
- int objc; /* Count of Tcl_Obj in the prefix of the
+ Tcl_Size objc; /* Count of Tcl_Obj in the prefix of the
* target command to be invoked in the target
* interpreter. Additional arguments specified
* when calling the alias in the child interp
@@ -67,14 +66,14 @@ typedef struct Alias {
/*
*
- * struct Child:
+ * Child:
*
* Used by the "interp" command to record and find information about child
* interpreters. Maps from a command name in the parent to information about a
* child interpreter, e.g. what aliases are defined in it.
*/
-typedef struct Child {
+typedef struct {
Tcl_Interp *parentInterp; /* Parent interpreter for this child. */
Tcl_HashEntry *childEntryPtr;
/* Hash entry in parents child table for this
@@ -113,7 +112,7 @@ typedef struct Target {
} Target;
/*
- * struct Parent:
+ * Parent:
*
* This record is used for two purposes: First, childTable (a hashtable) maps
* from names of commands to child interpreters. This hashtable is used to
@@ -128,7 +127,7 @@ typedef struct Target {
* only load safe extensions.
*/
-typedef struct Parent {
+typedef struct {
Tcl_HashTable childTable; /* Hash table for child interpreters. Maps
* from command names to Child records. */
Target *targetsPtr; /* The head of a doubly-linked list of all the
@@ -145,7 +144,7 @@ typedef struct Parent {
* on a per-interp basis.
*/
-typedef struct InterpInfo {
+typedef struct {
Parent parent; /* Keeps track of all interps for which this
* interp is the Parent. */
Child child; /* Information necessary for this interp to
@@ -159,7 +158,7 @@ typedef struct InterpInfo {
* likely to work properly on 64-bit architectures.
*/
-typedef struct ScriptLimitCallback {
+typedef struct {
Tcl_Interp *interp; /* The interpreter in which to execute the
* callback. */
Tcl_Obj *scriptObj; /* The script to execute to perform the
@@ -172,7 +171,7 @@ typedef struct ScriptLimitCallback {
* table. */
} ScriptLimitCallback;
-typedef struct ScriptLimitCallbackKey {
+typedef struct {
Tcl_Interp *interp; /* The interpreter that the limit callback was
* attached to. This is not the interpreter
* that the callback runs in! */
@@ -216,7 +215,7 @@ struct LimitHandler {
static int AliasCreate(Tcl_Interp *interp,
Tcl_Interp *childInterp, Tcl_Interp *parentInterp,
- Tcl_Obj *namePtr, Tcl_Obj *targetPtr, int objc,
+ Tcl_Obj *namePtr, Tcl_Obj *targetPtr, Tcl_Size objc,
Tcl_Obj *const objv[]);
static int AliasDelete(Tcl_Interp *interp,
Tcl_Interp *childInterp, Tcl_Obj *namePtr);
@@ -226,24 +225,24 @@ static int AliasList(Tcl_Interp *interp, Tcl_Interp *childInterp);
static Tcl_ObjCmdProc AliasNRCmd;
static Tcl_CmdDeleteProc AliasObjCmdDeleteProc;
static Tcl_Interp * GetInterp(Tcl_Interp *interp, Tcl_Obj *pathPtr);
-static Tcl_Interp * GetInterp2(Tcl_Interp *interp, int objc,
+static Tcl_Interp * GetInterp2(Tcl_Interp *interp, Tcl_Size objc,
Tcl_Obj *const objv[]);
static Tcl_InterpDeleteProc InterpInfoDeleteProc;
static int ChildBgerror(Tcl_Interp *interp,
- Tcl_Interp *childInterp, int objc,
+ Tcl_Interp *childInterp, Tcl_Size objc,
Tcl_Obj *const objv[]);
static Tcl_Interp * ChildCreate(Tcl_Interp *interp, Tcl_Obj *pathPtr,
int safe);
static int ChildDebugCmd(Tcl_Interp *interp,
Tcl_Interp *childInterp,
- int objc, Tcl_Obj *const objv[]);
+ Tcl_Size objc, Tcl_Obj *const objv[]);
static int ChildEval(Tcl_Interp *interp, Tcl_Interp *childInterp,
- int objc, Tcl_Obj *const objv[]);
+ Tcl_Size objc, Tcl_Obj *const objv[]);
static int ChildExpose(Tcl_Interp *interp,
- Tcl_Interp *childInterp, int objc,
+ Tcl_Interp *childInterp, Tcl_Size objc,
Tcl_Obj *const objv[]);
static int ChildHide(Tcl_Interp *interp, Tcl_Interp *childInterp,
- int objc, Tcl_Obj *const objv[]);
+ Tcl_Size objc, Tcl_Obj *const objv[]);
static int ChildHidden(Tcl_Interp *interp,
Tcl_Interp *childInterp);
static int ChildInvokeHidden(Tcl_Interp *interp,
@@ -254,14 +253,14 @@ static int ChildMarkTrusted(Tcl_Interp *interp,
Tcl_Interp *childInterp);
static Tcl_CmdDeleteProc ChildObjCmdDeleteProc;
static int ChildRecursionLimit(Tcl_Interp *interp,
- Tcl_Interp *childInterp, int objc,
+ Tcl_Interp *childInterp, Tcl_Size objc,
Tcl_Obj *const objv[]);
static int ChildCommandLimitCmd(Tcl_Interp *interp,
- Tcl_Interp *childInterp, int consumedObjc,
- int objc, Tcl_Obj *const objv[]);
+ Tcl_Interp *childInterp, Tcl_Size consumedObjc,
+ Tcl_Size objc, Tcl_Obj *const objv[]);
static int ChildTimeLimitCmd(Tcl_Interp *interp,
- Tcl_Interp *childInterp, int consumedObjc,
- int objc, Tcl_Obj *const objv[]);
+ Tcl_Interp *childInterp, Tcl_Size consumedObjc,
+ Tcl_Size objc, Tcl_Obj *const objv[]);
static void InheritLimitsFromParent(Tcl_Interp *childInterp,
Tcl_Interp *parentInterp);
static void SetScriptLimitCallback(Tcl_Interp *interp, int type,
@@ -704,7 +703,8 @@ NRInterpCmd(
}
return ChildBgerror(interp, childInterp, objc - 3, objv + 3);
case OPT_CANCEL: {
- int i, flags;
+ Tcl_Size i;
+ int flags;
Tcl_Obj *resultObjPtr;
static const char *const cancelOptions[] = {
"-unwind", "--", NULL
@@ -776,7 +776,8 @@ NRInterpCmd(
return Tcl_CancelEval(childInterp, resultObjPtr, 0, flags);
}
case OPT_CREATE: {
- int i, last, safe;
+ int last, safe;
+ Tcl_Size i;
Tcl_Obj *childPtr;
char buf[16 + TCL_INTEGER_SPACE];
static const char *const createOptions[] = {
@@ -827,7 +828,7 @@ NRInterpCmd(
for (i = 0; ; i++) {
Tcl_CmdInfo cmdInfo;
- snprintf(buf, sizeof(buf), "interp%d", i);
+ snprintf(buf, sizeof(buf), "interp%" TCL_SIZE_MODIFIER "d", i);
if (Tcl_GetCommandInfo(interp, buf, &cmdInfo) == 0) {
break;
}
@@ -858,7 +859,7 @@ NRInterpCmd(
}
return ChildDebugCmd(interp, childInterp, objc - 3, objv + 3);
case OPT_DELETE: {
- int i;
+ Tcl_Size i;
InterpInfo *iiPtr;
for (i = 2; i < objc; i++) {
@@ -936,7 +937,7 @@ NRInterpCmd(
Tcl_SetObjResult(interp, Tcl_NewBooleanObj(Tcl_IsSafe(childInterp)));
return TCL_OK;
case OPT_INVOKEHID: {
- int i;
+ Tcl_Size i;
const char *namespaceName;
static const char *const hiddenOptions[] = {
"-global", "-namespace", "--", NULL
@@ -1156,7 +1157,7 @@ static Tcl_Interp *
GetInterp2(
Tcl_Interp *interp, /* Default interp if no interp was specified
* on the command line. */
- int objc, /* Number of arguments. */
+ Tcl_Size objc, /* Number of arguments. */
Tcl_Obj *const objv[]) /* Argument objects. */
{
if (objc == 2) {
@@ -1352,13 +1353,13 @@ Tcl_GetAliasObj(
Tcl_Interp **targetInterpPtr,
/* (Return) target interpreter. */
const char **targetCmdPtr, /* (Return) name of target command. */
- int *objcPtr, /* (Return) count of addnl args. */
+ Tcl_Size *objcPtr, /* (Return) count of addnl args. */
Tcl_Obj ***objvPtr) /* (Return) additional args. */
{
InterpInfo *iiPtr = (InterpInfo *) ((Interp *) interp)->interpInfo;
Tcl_HashEntry *hPtr;
Alias *aliasPtr;
- int objc;
+ Tcl_Size objc;
Tcl_Obj **objv;
hPtr = Tcl_FindHashEntry(&iiPtr->child.aliasTable, aliasName);
@@ -1516,7 +1517,7 @@ AliasCreate(
* invoked. */
Tcl_Obj *namePtr, /* Name of alias cmd. */
Tcl_Obj *targetCmdPtr, /* Name of target cmd. */
- int objc, /* Additional arguments to store */
+ Tcl_Size objc, /* Additional arguments to store */
Tcl_Obj *const objv[]) /* with alias. */
{
Alias *aliasPtr;
@@ -1525,7 +1526,8 @@ AliasCreate(
Child *childPtr;
Parent *parentPtr;
Tcl_Obj **prefv;
- int isNew, i;
+ int isNew;
+ Tcl_Size i;
aliasPtr = (Alias *)ckalloc(sizeof(Alias) + objc * sizeof(Tcl_Obj *));
aliasPtr->token = namePtr;
@@ -1821,7 +1823,7 @@ AliasNRCmd(
Tcl_Obj *const objv[]) /* Argument vector. */
{
Alias *aliasPtr = (Alias *)clientData;
- int prefc, cmdc, i;
+ Tcl_Size prefc, cmdc, i;
Tcl_Obj **prefv, **cmdv;
Tcl_Obj *listPtr;
ListRep listRep;
@@ -1876,7 +1878,8 @@ TclAliasObjCmd(
#define ALIAS_CMDV_PREALLOC 10
Alias *aliasPtr = (Alias *)clientData;
Tcl_Interp *targetInterp = aliasPtr->targetInterp;
- int result, prefc, cmdc, i;
+ int result;
+ Tcl_Size prefc, cmdc, i;
Tcl_Obj **prefv, **cmdv;
Tcl_Obj *cmdArr[ALIAS_CMDV_PREALLOC];
Interp *tPtr = (Interp *) targetInterp;
@@ -1966,7 +1969,8 @@ TclLocalAliasObjCmd(
{
#define ALIAS_CMDV_PREALLOC 10
Alias *aliasPtr = (Alias *)clientData;
- int result, prefc, cmdc, i;
+ int result;
+ Tcl_Size prefc, cmdc, i;
Tcl_Obj **prefv, **cmdv;
Tcl_Obj *cmdArr[ALIAS_CMDV_PREALLOC];
Interp *iPtr = (Interp *) interp;
@@ -2048,7 +2052,7 @@ AliasObjCmdDeleteProc(
{
Alias *aliasPtr = (Alias *)clientData;
Target *targetPtr;
- int i;
+ Tcl_Size i;
Tcl_Obj **objv;
Tcl_DecrRefCount(aliasPtr->token);
@@ -2372,7 +2376,7 @@ static int
ChildBgerror(
Tcl_Interp *interp, /* Interp for error return. */
Tcl_Interp *childInterp, /* Interp in which limit is set/queried. */
- int objc, /* Set or Query. */
+ Tcl_Size objc, /* Set or Query. */
Tcl_Obj *const objv[]) /* Argument strings. */
{
if (objc) {
@@ -2661,7 +2665,7 @@ NRChildCmd(
Tcl_SetObjResult(interp, Tcl_NewBooleanObj(Tcl_IsSafe(childInterp)));
return TCL_OK;
case OPT_INVOKEHIDDEN: {
- int i;
+ Tcl_Size i;
const char *namespaceName;
static const char *const hiddenOptions[] = {
"-global", "-namespace", "--", NULL
@@ -2811,7 +2815,7 @@ ChildDebugCmd(
Tcl_Interp *interp, /* Interp for error return. */
Tcl_Interp *childInterp, /* The child interpreter in which command
* will be evaluated. */
- int objc, /* Number of arguments. */
+ Tcl_Size objc, /* Number of arguments. */
Tcl_Obj *const objv[]) /* Argument objects. */
{
static const char *const debugTypes[] = {
@@ -2882,7 +2886,7 @@ ChildEval(
Tcl_Interp *interp, /* Interp for error return. */
Tcl_Interp *childInterp, /* The child interpreter in which command
* will be evaluated. */
- int objc, /* Number of arguments. */
+ Tcl_Size objc, /* Number of arguments. */
Tcl_Obj *const objv[]) /* Argument objects. */
{
int result;
@@ -2945,7 +2949,7 @@ static int
ChildExpose(
Tcl_Interp *interp, /* Interp for error return. */
Tcl_Interp *childInterp, /* Interp in which command will be exposed. */
- int objc, /* Number of arguments. */
+ Tcl_Size objc, /* Number of arguments. */
Tcl_Obj *const objv[]) /* Argument strings. */
{
const char *name;
@@ -2989,7 +2993,7 @@ static int
ChildRecursionLimit(
Tcl_Interp *interp, /* Interp for error return. */
Tcl_Interp *childInterp, /* Interp in which limit is set/queried. */
- int objc, /* Set or Query. */
+ Tcl_Size objc, /* Set or Query. */
Tcl_Obj *const objv[]) /* Argument strings. */
{
Interp *iPtr;
@@ -3051,7 +3055,7 @@ static int
ChildHide(
Tcl_Interp *interp, /* Interp for error return. */
Tcl_Interp *childInterp, /* Interp in which command will be exposed. */
- int objc, /* Number of arguments. */
+ Tcl_Size objc, /* Number of arguments. */
Tcl_Obj *const objv[]) /* Argument strings. */
{
const char *name;
@@ -3623,7 +3627,7 @@ Tcl_LimitAddHandler(
* Convert everything into a real deletion callback.
*/
- if (deleteProc == (Tcl_LimitHandlerDeleteProc *) TCL_DYNAMIC) {
+ if (deleteProc == (Tcl_LimitHandlerDeleteProc *)TCL_DYNAMIC) {
deleteProc = WrapFree;
}
@@ -4321,7 +4325,7 @@ SetScriptLimitCallback(
key.type = type;
if (scriptObj == NULL) {
- hashPtr = Tcl_FindHashEntry(&iPtr->limit.callbacks, (char *) &key);
+ hashPtr = Tcl_FindHashEntry(&iPtr->limit.callbacks, &key);
if (hashPtr != NULL) {
Tcl_LimitRemoveHandler(targetInterp, type, CallScriptLimitCallback,
Tcl_GetHashValue(hashPtr));
@@ -4489,8 +4493,8 @@ static int
ChildCommandLimitCmd(
Tcl_Interp *interp, /* Current interpreter. */
Tcl_Interp *childInterp, /* Interpreter being adjusted. */
- int consumedObjc, /* Number of args already parsed. */
- int objc, /* Total number of arguments. */
+ Tcl_Size consumedObjc, /* Number of args already parsed. */
+ Tcl_Size objc, /* Total number of arguments. */
Tcl_Obj *const objv[]) /* Argument objects. */
{
static const char *const options[] = {
@@ -4525,7 +4529,7 @@ ChildCommandLimitCmd(
TclNewObj(dictPtr);
key.interp = childInterp;
key.type = TCL_LIMIT_COMMANDS;
- hPtr = Tcl_FindHashEntry(&iPtr->limit.callbacks, (char *) &key);
+ hPtr = Tcl_FindHashEntry(&iPtr->limit.callbacks, &key);
if (hPtr != NULL) {
limitCBPtr = (ScriptLimitCallback *)Tcl_GetHashValue(hPtr);
if (limitCBPtr != NULL && limitCBPtr->scriptObj != NULL) {
@@ -4567,7 +4571,7 @@ ChildCommandLimitCmd(
case OPT_CMD:
key.interp = childInterp;
key.type = TCL_LIMIT_COMMANDS;
- hPtr = Tcl_FindHashEntry(&iPtr->limit.callbacks, (char *) &key);
+ hPtr = Tcl_FindHashEntry(&iPtr->limit.callbacks, &key);
if (hPtr != NULL) {
limitCBPtr = (ScriptLimitCallback *)Tcl_GetHashValue(hPtr);
if (limitCBPtr != NULL && limitCBPtr->scriptObj != NULL) {
@@ -4591,8 +4595,7 @@ ChildCommandLimitCmd(
Tcl_WrongNumArgs(interp, consumedObjc, objv, "?-option value ...?");
return TCL_ERROR;
} else {
- int i;
- Tcl_Size scriptLen = 0, limitLen = 0;
+ Tcl_Size i, scriptLen = 0, limitLen = 0;
Tcl_Obj *scriptObj = NULL, *granObj = NULL, *limitObj = NULL;
int gran = 0, limit = 0;
@@ -4678,8 +4681,8 @@ static int
ChildTimeLimitCmd(
Tcl_Interp *interp, /* Current interpreter. */
Tcl_Interp *childInterp, /* Interpreter being adjusted. */
- int consumedObjc, /* Number of args already parsed. */
- int objc, /* Total number of arguments. */
+ Tcl_Size consumedObjc, /* Number of args already parsed. */
+ Tcl_Size objc, /* Total number of arguments. */
Tcl_Obj *const objv[]) /* Argument objects. */
{
static const char *const options[] = {
@@ -4714,7 +4717,7 @@ ChildTimeLimitCmd(
TclNewObj(dictPtr);
key.interp = childInterp;
key.type = TCL_LIMIT_TIME;
- hPtr = Tcl_FindHashEntry(&iPtr->limit.callbacks, (char *) &key);
+ hPtr = Tcl_FindHashEntry(&iPtr->limit.callbacks, &key);
if (hPtr != NULL) {
limitCBPtr = (ScriptLimitCallback *)Tcl_GetHashValue(hPtr);
if (limitCBPtr != NULL && limitCBPtr->scriptObj != NULL) {
@@ -4762,7 +4765,7 @@ ChildTimeLimitCmd(
case OPT_CMD:
key.interp = childInterp;
key.type = TCL_LIMIT_TIME;
- hPtr = Tcl_FindHashEntry(&iPtr->limit.callbacks, (char *) &key);
+ hPtr = Tcl_FindHashEntry(&iPtr->limit.callbacks, &key);
if (hPtr != NULL) {
limitCBPtr = (ScriptLimitCallback *)Tcl_GetHashValue(hPtr);
if (limitCBPtr != NULL && limitCBPtr->scriptObj != NULL) {
@@ -4797,8 +4800,7 @@ ChildTimeLimitCmd(
Tcl_WrongNumArgs(interp, consumedObjc, objv, "?-option value ...?");
return TCL_ERROR;
} else {
- int i;
- Tcl_Size scriptLen = 0, milliLen = 0, secLen = 0;
+ Tcl_Size i, scriptLen = 0, milliLen = 0, secLen = 0;
Tcl_Obj *scriptObj = NULL, *granObj = NULL;
Tcl_Obj *milliObj = NULL, *secObj = NULL;
int gran = 0;
diff --git a/generic/tclTestObj.c b/generic/tclTestObj.c
index 8a9dc7b..4a23369 100644
--- a/generic/tclTestObj.c
+++ b/generic/tclTestObj.c
@@ -109,6 +109,9 @@ TclObjTest_Init(
*/
Tcl_Obj **varPtr;
+ if (Tcl_TomMath_InitStubs(interp, "8.5-") == NULL) {
+ return TCL_ERROR;
+ }
varPtr = (Tcl_Obj **)ckalloc(NUMBER_OF_OBJECT_VARS *sizeof(varPtr[0]));
if (!varPtr) {
return TCL_ERROR;