summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2022-01-17 10:35:18 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2022-01-17 10:35:18 (GMT)
commite5a2ebd71b2aa2b31ca5128eb47ae0a7fdd20bd5 (patch)
tree67c205a4448d7fb5212f23d7982bc44da6a3ce2d /generic
parenta9eaf6765198716158f4927d71f64d20182f1ad2 (diff)
downloadtcl-e5a2ebd71b2aa2b31ca5128eb47ae0a7fdd20bd5.zip
tcl-e5a2ebd71b2aa2b31ca5128eb47ae0a7fdd20bd5.tar.gz
tcl-e5a2ebd71b2aa2b31ca5128eb47ae0a7fdd20bd5.tar.bz2
Follow-up to [767e070d35]: Tcl_GetRange and Tcl_GetUniChar do not validate index inputs.
Now that Tcl_GetRange() checks its arguments, the callers of this function don't have to do that any more. This also shows a off-by-one error in the Tcl_GetRange() check
Diffstat (limited to 'generic')
-rw-r--r--generic/tclCmdMZ.c10
-rw-r--r--generic/tclExecute.c33
-rw-r--r--generic/tclStringObj.c7
3 files changed, 8 insertions, 42 deletions
diff --git a/generic/tclCmdMZ.c b/generic/tclCmdMZ.c
index da3fc8b..5422b7f 100644
--- a/generic/tclCmdMZ.c
+++ b/generic/tclCmdMZ.c
@@ -2183,15 +2183,7 @@ StringRangeCmd(
return TCL_ERROR;
}
- if (first < 0) {
- first = 0;
- }
- if (last >= length) {
- last = length;
- }
- if (last >= first) {
- Tcl_SetObjResult(interp, Tcl_GetRange(objv[1], first, last));
- }
+ Tcl_SetObjResult(interp, Tcl_GetRange(objv[1], first, last));
return TCL_OK;
}
diff --git a/generic/tclExecute.c b/generic/tclExecute.c
index e5a6b71..c39bc21 100644
--- a/generic/tclExecute.c
+++ b/generic/tclExecute.c
@@ -5609,17 +5609,7 @@ TEBCresume(
goto gotError;
}
- if (fromIdx < 0) {
- fromIdx = 0;
- }
- if (toIdx >= length) {
- toIdx = length;
- }
- if (toIdx >= fromIdx) {
- objResultPtr = Tcl_GetRange(OBJ_AT_DEPTH(2), fromIdx, toIdx);
- } else {
- TclNewObj(objResultPtr);
- }
+ objResultPtr = Tcl_GetRange(OBJ_AT_DEPTH(2), fromIdx, toIdx);
TRACE_APPEND(("\"%.30s\"\n", O2S(objResultPtr)));
NEXT_INST_V(1, 3, 1);
@@ -5652,13 +5642,6 @@ TEBCresume(
}
toIdx = TclIndexDecode(toIdx, length - 1);
- if (toIdx < 0) {
- goto emptyRange;
- } else if (toIdx >= length) {
- toIdx = length - 1;
- }
-
- assert ( toIdx >= 0 && toIdx < length );
/*
assert ( fromIdx != TCL_INDEX_BEFORE );
@@ -5670,19 +5653,11 @@ TEBCresume(
fromIdx = TCL_INDEX_START;
}
if (fromIdx == TCL_INDEX_AFTER) {
- goto emptyRange;
- }
-
- fromIdx = TclIndexDecode(fromIdx, length - 1);
- if (fromIdx < 0) {
- fromIdx = 0;
- }
-
- if (fromIdx <= toIdx) {
- objResultPtr = Tcl_GetRange(valuePtr, fromIdx, toIdx);
- } else {
emptyRange:
TclNewObj(objResultPtr);
+ } else {
+ fromIdx = TclIndexDecode(fromIdx, length - 1);
+ objResultPtr = Tcl_GetRange(valuePtr, fromIdx, toIdx);
}
TRACE_APPEND(("%.30s\n", O2S(objResultPtr)));
NEXT_INST_F(9, 1, 1);
diff --git a/generic/tclStringObj.c b/generic/tclStringObj.c
index edfcb9f..fc675cf 100644
--- a/generic/tclStringObj.c
+++ b/generic/tclStringObj.c
@@ -739,8 +739,7 @@ Tcl_GetUnicodeFromObj(
*
* Create a Tcl Object that contains the chars between first and last of
* the object indicated by "objPtr". If the object is not already a
- * String object, convert it to one. The first and last indices are
- * assumed to be in the appropriate range.
+ * String object, convert it to one.
*
* Results:
* Returns a new Tcl Object of the String type.
@@ -818,8 +817,8 @@ Tcl_GetRange(
FillUnicodeRep(objPtr);
stringPtr = GET_STRING(objPtr);
}
- if (last > stringPtr->numChars) {
- last = stringPtr->numChars;
+ if (last >= stringPtr->numChars) {
+ last = stringPtr->numChars - 1;
}
if (last < first) {
return Tcl_NewObj();