summaryrefslogtreecommitdiffstats
path: root/generic/tclBasic.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2022-09-07 13:28:07 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2022-09-07 13:28:07 (GMT)
commit37386d726b21f9775a5a36b86e36201d5755f4bd (patch)
tree60d7bd203a810a2b3666d69fc79c926ff4f32719 /generic/tclBasic.c
parenta10ceedaec45bd6c5cb247ee80ad91d59e87cda3 (diff)
parent67be0a6752a150bad176f36988e3af03f25cc4d3 (diff)
downloadtcl-37386d726b21f9775a5a36b86e36201d5755f4bd.zip
tcl-37386d726b21f9775a5a36b86e36201d5755f4bd.tar.gz
tcl-37386d726b21f9775a5a36b86e36201d5755f4bd.tar.bz2
Merge 8.7
Diffstat (limited to 'generic/tclBasic.c')
-rw-r--r--generic/tclBasic.c32
1 files changed, 23 insertions, 9 deletions
diff --git a/generic/tclBasic.c b/generic/tclBasic.c
index 7a955ec..420d7ec 100644
--- a/generic/tclBasic.c
+++ b/generic/tclBasic.c
@@ -2691,26 +2691,30 @@ Tcl_CreateCommand(
*/
typedef struct {
- void *clientData; /* Arbitrary value to pass to object function. */
Tcl_ObjCmdProc2 *proc;
- Tcl_ObjCmdProc2 *nreProc;
+ void *clientData; /* Arbitrary value to pass to proc function. */
Tcl_CmdDeleteProc *deleteProc;
+ void *deleteData; /* Arbitrary value to pass to deleteProc function. */
+ Tcl_ObjCmdProc2 *nreProc;
} CmdWrapperInfo;
static int cmdWrapperProc(void *clientData,
- Tcl_Interp *interp,
- int objc,
+ Tcl_Interp *interp,
+ int objc,
Tcl_Obj * const *objv)
{
CmdWrapperInfo *info = (CmdWrapperInfo *)clientData;
+ if (objc < 0) {
+ objc = -1;
+ }
return info->proc(info->clientData, interp, objc, objv);
}
static void cmdWrapperDeleteProc(void *clientData) {
CmdWrapperInfo *info = (CmdWrapperInfo *)clientData;
- clientData = info->clientData;
+ clientData = info->deleteData;
Tcl_CmdDeleteProc *deleteProc = info->deleteProc;
ckfree(info);
if (deleteProc != NULL) {
@@ -2737,8 +2741,9 @@ Tcl_CreateObjCommand2(
{
CmdWrapperInfo *info = (CmdWrapperInfo *)ckalloc(sizeof(CmdWrapperInfo));
info->proc = proc;
- info->deleteProc = deleteProc;
info->clientData = clientData;
+ info->deleteProc = deleteProc;
+ info->deleteData = clientData;
return Tcl_CreateObjCommand(interp, cmdName,
(proc ? cmdWrapperProc : NULL),
@@ -3381,7 +3386,7 @@ Tcl_SetCommandInfoFromToken(
if (cmdPtr->deleteProc == cmdWrapperDeleteProc) {
CmdWrapperInfo *info = (CmdWrapperInfo *)cmdPtr->deleteData;
info->deleteProc = infoPtr->deleteProc;
- info->clientData = infoPtr->deleteData;
+ info->deleteData = infoPtr->deleteData;
} else {
cmdPtr->deleteProc = infoPtr->deleteProc;
cmdPtr->deleteData = infoPtr->deleteData;
@@ -3465,7 +3470,7 @@ Tcl_GetCommandInfoFromToken(
if (cmdPtr->deleteProc == cmdWrapperDeleteProc) {
CmdWrapperInfo *info = (CmdWrapperInfo *)cmdPtr->deleteData;
infoPtr->deleteProc = info->deleteProc;
- infoPtr->deleteData = info->clientData;
+ infoPtr->deleteData = info->deleteData;
} else {
infoPtr->deleteProc = cmdPtr->deleteProc;
infoPtr->deleteData = cmdPtr->deleteData;
@@ -9188,6 +9193,11 @@ Tcl_NRCallObjProc2(
size_t objc,
Tcl_Obj *const objv[])
{
+ if (objc > INT_MAX) {
+ Tcl_WrongNumArgs(interp, 1, objv, "?args?");
+ return TCL_ERROR;
+ }
+
NRE_callback *rootPtr = TOP_CB(interp);
CmdWrapperInfo *info = (CmdWrapperInfo *)ckalloc(sizeof(CmdWrapperInfo));
info->clientData = clientData;
@@ -9233,6 +9243,9 @@ static int cmdWrapperNreProc(
Tcl_Obj *const objv[])
{
CmdWrapperInfo *info = (CmdWrapperInfo *)clientData;
+ if (objc < 0) {
+ objc = -1;
+ }
return info->nreProc(info->clientData, interp, objc, objv);
}
@@ -9257,9 +9270,10 @@ Tcl_NRCreateCommand2(
{
CmdWrapperInfo *info = (CmdWrapperInfo *)ckalloc(sizeof(CmdWrapperInfo));
info->proc = proc;
+ info->clientData = clientData;
info->nreProc = nreProc;
info->deleteProc = deleteProc;
- info->clientData = clientData;
+ info->deleteData = clientData;
return Tcl_NRCreateCommand(interp, cmdName,
(proc ? cmdWrapperProc : NULL),
(nreProc ? cmdWrapperNreProc : NULL),