summaryrefslogtreecommitdiffstats
path: root/generic/tclStubInit.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tclStubInit.c')
-rw-r--r--generic/tclStubInit.c68
1 files changed, 61 insertions, 7 deletions
diff --git a/generic/tclStubInit.c b/generic/tclStubInit.c
index 1b1ad89..e080d44 100644
--- a/generic/tclStubInit.c
+++ b/generic/tclStubInit.c
@@ -92,57 +92,110 @@ static void uniCodePanic() {
#define TclSplitList_ SplitList
#define TclSplitPath_ SplitPath
#define TclFSSplitPath_ FSSplitPath
+#define TclParseArgsObjv_ ParseArgsObjv
int LOGetElements(Tcl_Interp *interp, Tcl_Obj *listPtr,
int *objcPtr, Tcl_Obj ***objvPtr) {
- size_t n;
+ size_t n = TCL_INDEX_NONE;
int result = Tcl_ListObjGetElements(interp, listPtr, &n, objvPtr);
if (objcPtr) {
+ if ((result == TCL_OK) && (n > INT_MAX)) {
+ if (interp) {
+ Tcl_AppendResult(interp, "List too large to be processed", NULL);
+ }
+ return TCL_ERROR;
+ }
*objcPtr = n;
}
return result;
}
int LOLength(Tcl_Interp *interp, Tcl_Obj *listPtr,
int *lengthPtr) {
- size_t n;
+ size_t n = TCL_INDEX_NONE;
int result = Tcl_ListObjLength(interp, listPtr, &n);
if (lengthPtr) {
+ if ((result == TCL_OK) && (n > INT_MAX)) {
+ if (interp) {
+ Tcl_AppendResult(interp, "List too large to be processed", NULL);
+ }
+ return TCL_ERROR;
+ }
*lengthPtr = n;
}
return result;
}
static int DOSize(Tcl_Interp *interp, Tcl_Obj *dictPtr,
int *sizePtr) {
- size_t n;
+ size_t n = TCL_INDEX_NONE;
int result = Tcl_DictObjSize(interp, dictPtr, &n);
if (sizePtr) {
+ if ((result == TCL_OK) && (n > INT_MAX)) {
+ if (interp) {
+ Tcl_AppendResult(interp, "Dict too large to be processed", NULL);
+ }
+ return TCL_ERROR;
+ }
*sizePtr = n;
}
return result;
}
static int SplitList(Tcl_Interp *interp, const char *listStr, int *argcPtr,
const char ***argvPtr) {
- size_t n;
+ size_t n = TCL_INDEX_NONE;
int result = Tcl_SplitList(interp, listStr, &n, argvPtr);
if (argcPtr) {
+ if ((result == TCL_OK) && (n > INT_MAX)) {
+ if (interp) {
+ Tcl_AppendResult(interp, "List too large to be processed", NULL);
+ }
+ Tcl_Free(*argvPtr);
+ return TCL_ERROR;
+ }
*argcPtr = n;
}
return result;
}
static void SplitPath(const char *path, int *argcPtr, const char ***argvPtr) {
- size_t n;
+ size_t n = TCL_INDEX_NONE;
Tcl_SplitPath(path, &n, argvPtr);
if (argcPtr) {
+ if (n > INT_MAX) {
+ n = TCL_INDEX_NONE; /* No other way to return an error-situation */
+ Tcl_Free(*argvPtr);
+ *argvPtr = NULL;
+ }
*argcPtr = n;
}
}
static Tcl_Obj *FSSplitPath(Tcl_Obj *pathPtr, int *lenPtr) {
- size_t n;
+ size_t n = TCL_INDEX_NONE;
Tcl_Obj *result = Tcl_FSSplitPath(pathPtr, &n);
if (lenPtr) {
+ if (result && (n > INT_MAX)) {
+ Tcl_DecrRefCount(result);
+ return NULL;
+ }
*lenPtr = n;
}
return result;
}
+static int ParseArgsObjv(Tcl_Interp *interp,
+ const Tcl_ArgvInfo *argTable, int *objcPtr, Tcl_Obj *const *objv,
+ Tcl_Obj ***remObjv) {
+ size_t n = TCL_INDEX_NONE;
+ int result = Tcl_ParseArgsObjv(interp, argTable, &n, objv, remObjv);
+ if (objcPtr) {
+ if ((result == TCL_OK) && (n > INT_MAX)) {
+ if (interp) {
+ Tcl_AppendResult(interp, "Too many args to be processed", NULL);
+ }
+ Tcl_Free(*remObjv);
+ *remObjv = NULL;
+ return TCL_ERROR;
+ }
+ *objcPtr = n;
+ }
+ return result;
+}
#define TclBN_mp_add mp_add
#define TclBN_mp_add_d mp_add_d
@@ -1352,7 +1405,7 @@ const TclStubs tclStubs = {
Tcl_GetBlockSizeFromStat, /* 601 */
Tcl_SetEnsembleParameterList, /* 602 */
Tcl_GetEnsembleParameterList, /* 603 */
- Tcl_ParseArgsObjv, /* 604 */
+ TclParseArgsObjv_, /* 604 */
Tcl_GetErrorLine, /* 605 */
Tcl_SetErrorLine, /* 606 */
Tcl_TransferResult, /* 607 */
@@ -1415,6 +1468,7 @@ const TclStubs tclStubs = {
Tcl_SplitList, /* 664 */
Tcl_SplitPath, /* 665 */
Tcl_FSSplitPath, /* 666 */
+ Tcl_ParseArgsObjv, /* 667 */
};
/* !END!: Do not edit above this line. */