summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2022-11-28 12:34:28 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2022-11-28 12:34:28 (GMT)
commit85f19595dc650bbe923db351eaa0f77470de1a32 (patch)
tree983a4f22b21bd9041ebf258f12fd3fb1aebdf410
parentba490472b58358406e7f04356e4e8a076644d9c6 (diff)
parent18f90309e43e13dde5891a7548dad46e248e2c9a (diff)
downloadtcl-85f19595dc650bbe923db351eaa0f77470de1a32.zip
tcl-85f19595dc650bbe923db351eaa0f77470de1a32.tar.gz
tcl-85f19595dc650bbe923db351eaa0f77470de1a32.tar.bz2
Merge 8.7
-rwxr-xr-xgeneric/tclArithSeries.c20
-rw-r--r--generic/tclArithSeries.h14
-rw-r--r--generic/tclInt.decls2
-rw-r--r--generic/tclIntDecls.h6
-rw-r--r--generic/tclListObj.c9
-rw-r--r--generic/tclTest.c36
-rw-r--r--tests/link.test2
7 files changed, 64 insertions, 25 deletions
diff --git a/generic/tclArithSeries.c b/generic/tclArithSeries.c
index edfd96e..cca0c58 100755
--- a/generic/tclArithSeries.c
+++ b/generic/tclArithSeries.c
@@ -431,7 +431,7 @@ TclArithSeriesObjIndex(Tcl_Obj *arithSeriesPtr, Tcl_WideInt index, Tcl_Obj **ele
Tcl_Panic("TclArithSeriesObjIndex called with a not ArithSeries Obj.");
}
arithSeriesRepPtr = ArithSeriesRepPtr(arithSeriesPtr);
- if (index < 0 || index >= arithSeriesRepPtr->len) {
+ if (index < 0 || (Tcl_Size)index >= arithSeriesRepPtr->len) {
return TCL_ERROR;
}
/* List[i] = Start + (Step * index) */
@@ -460,7 +460,7 @@ TclArithSeriesObjIndex(Tcl_Obj *arithSeriesPtr, Tcl_WideInt index, Tcl_Obj **ele
*
*----------------------------------------------------------------------
*/
-Tcl_WideInt TclArithSeriesObjLength(Tcl_Obj *arithSeriesPtr)
+Tcl_Size TclArithSeriesObjLength(Tcl_Obj *arithSeriesPtr)
{
ArithSeries *arithSeriesRepPtr = (ArithSeries*)
arithSeriesPtr->internalRep.twoPtrValue.ptr1;
@@ -491,7 +491,7 @@ FreeArithSeriesInternalRep(Tcl_Obj *arithSeriesPtr)
ArithSeries *arithSeriesRepPtr =
(ArithSeries *) arithSeriesPtr->internalRep.twoPtrValue.ptr1;
if (arithSeriesRepPtr->elements) {
- Tcl_WideInt i;
+ Tcl_Size i;
Tcl_Obj**elmts = arithSeriesRepPtr->elements;
for(i=0; i<arithSeriesRepPtr->len; i++) {
if (elmts[i]) {
@@ -576,7 +576,7 @@ UpdateStringOfArithSeries(Tcl_Obj *arithSeriesPtr)
(ArithSeries*) arithSeriesPtr->internalRep.twoPtrValue.ptr1;
char *elem, *p;
Tcl_Obj *elemObj;
- Tcl_WideInt i;
+ Tcl_Size i;
Tcl_WideInt length = 0;
size_t slen;
@@ -730,7 +730,7 @@ TclArithSeriesObjRange(
Tcl_SetObjResult(
interp,
Tcl_ObjPrintf("index %" TCL_Z_MODIFIER "u is out of bounds 0 to %"
- TCL_LL_MODIFIER "d", fromIdx, (arithSeriesRepPtr->len-1)));
+ TCL_Z_MODIFIER "u", fromIdx, (arithSeriesRepPtr->len-1)));
Tcl_SetErrorCode(interp, "TCL", "MEMORY", NULL);
}
return NULL;
@@ -741,7 +741,7 @@ TclArithSeriesObjRange(
Tcl_SetObjResult(
interp,
Tcl_ObjPrintf("index %" TCL_Z_MODIFIER "u is out of bounds 0 to %"
- TCL_LL_MODIFIER "d", fromIdx, (arithSeriesRepPtr->len-1)));
+ TCL_Z_MODIFIER "d", fromIdx, (arithSeriesRepPtr->len-1)));
Tcl_SetErrorCode(interp, "TCL", "MEMORY", NULL);
}
return NULL;
@@ -1002,3 +1002,11 @@ TclArithSeriesObjReverse(
return resultObj;
}
+
+/*
+ * Local Variables:
+ * mode: c
+ * c-basic-offset: 4
+ * fill-column: 78
+ * End:
+ */
diff --git a/generic/tclArithSeries.h b/generic/tclArithSeries.h
index f7f2fa8..1daacdd 100644
--- a/generic/tclArithSeries.h
+++ b/generic/tclArithSeries.h
@@ -16,7 +16,7 @@
* but it's faster to cache it inside the internal representation.
*/
typedef struct ArithSeries {
- Tcl_WideInt len;
+ Tcl_Size len;
Tcl_Obj **elements;
int isDouble;
Tcl_WideInt start;
@@ -24,7 +24,7 @@ typedef struct ArithSeries {
Tcl_WideInt step;
} ArithSeries;
typedef struct ArithSeriesDbl {
- Tcl_WideInt len;
+ Tcl_Size len;
Tcl_Obj **elements;
int isDouble;
double start;
@@ -39,7 +39,7 @@ MODULE_SCOPE int TclArithSeriesObjStep(Tcl_Obj *arithSeriesPtr,
Tcl_Obj **stepObj);
MODULE_SCOPE int TclArithSeriesObjIndex(Tcl_Obj *arithSeriesPtr,
Tcl_WideInt index, Tcl_Obj **elementObj);
-MODULE_SCOPE Tcl_WideInt TclArithSeriesObjLength(Tcl_Obj *arithSeriesPtr);
+MODULE_SCOPE Tcl_Size TclArithSeriesObjLength(Tcl_Obj *arithSeriesPtr);
MODULE_SCOPE Tcl_Obj * TclArithSeriesObjRange(Tcl_Interp *interp,
Tcl_Obj *arithSeriesPtr, Tcl_Size fromIdx, Tcl_Size toIdx);
MODULE_SCOPE Tcl_Obj * TclArithSeriesObjReverse(Tcl_Interp *interp,
@@ -55,3 +55,11 @@ MODULE_SCOPE int TclNewArithSeriesObj(Tcl_Interp *interp,
Tcl_Obj **arithSeriesObj, int useDoubles,
Tcl_Obj *startObj, Tcl_Obj *endObj,
Tcl_Obj *stepObj, Tcl_Obj *lenObj);
+
+/*
+ * Local Variables:
+ * mode: c
+ * c-basic-offset: 4
+ * fill-column: 78
+ * End:
+ */
diff --git a/generic/tclInt.decls b/generic/tclInt.decls
index 0c88b87..10cfbf6 100644
--- a/generic/tclInt.decls
+++ b/generic/tclInt.decls
@@ -706,7 +706,7 @@ declare 258 {
# TIP 625: for unit testing - create list objects with span
declare 260 {
- Tcl_Obj *TclListTestObj(Tcl_Size length, Tcl_Size leadingSpace, Tcl_Size endSpace)
+ Tcl_Obj *TclListTestObj(size_t length, size_t leadingSpace, size_t endSpace)
}
# TIP 625: for unit testing - check list invariants
diff --git a/generic/tclIntDecls.h b/generic/tclIntDecls.h
index 128e3c9..d6168b5 100644
--- a/generic/tclIntDecls.h
+++ b/generic/tclIntDecls.h
@@ -578,8 +578,8 @@ EXTERN Tcl_Obj * TclpCreateTemporaryDirectory(Tcl_Obj *dirObj,
Tcl_Obj *basenameObj);
/* Slot 259 is reserved */
/* 260 */
-EXTERN Tcl_Obj * TclListTestObj(Tcl_Size length,
- Tcl_Size leadingSpace, Tcl_Size endSpace);
+EXTERN Tcl_Obj * TclListTestObj(size_t length, size_t leadingSpace,
+ size_t endSpace);
/* 261 */
EXTERN void TclListObjValidate(Tcl_Interp *interp,
Tcl_Obj *listObj);
@@ -848,7 +848,7 @@ typedef struct TclIntStubs {
void (*tclStaticLibrary) (Tcl_Interp *interp, const char *prefix, Tcl_LibraryInitProc *initProc, Tcl_LibraryInitProc *safeInitProc); /* 257 */
Tcl_Obj * (*tclpCreateTemporaryDirectory) (Tcl_Obj *dirObj, Tcl_Obj *basenameObj); /* 258 */
void (*reserved259)(void);
- Tcl_Obj * (*tclListTestObj) (Tcl_Size length, Tcl_Size leadingSpace, Tcl_Size endSpace); /* 260 */
+ Tcl_Obj * (*tclListTestObj) (size_t length, size_t leadingSpace, size_t endSpace); /* 260 */
void (*tclListObjValidate) (Tcl_Interp *interp, Tcl_Obj *listObj); /* 261 */
} TclIntStubs;
diff --git a/generic/tclListObj.c b/generic/tclListObj.c
index 5264dff..93e4478 100644
--- a/generic/tclListObj.c
+++ b/generic/tclListObj.c
@@ -3508,10 +3508,10 @@ UpdateStringOfList(
*------------------------------------------------------------------------
*/
Tcl_Obj *
-TclListTestObj(Tcl_Size length, Tcl_Size leadingSpace, Tcl_Size endSpace)
+TclListTestObj(size_t length, size_t leadingSpace, size_t endSpace)
{
ListRep listRep;
- Tcl_Size capacity;
+ size_t capacity;
Tcl_Obj *listObj;
TclNewObj(listObj);
@@ -3521,11 +3521,14 @@ TclListTestObj(Tcl_Size length, Tcl_Size leadingSpace, Tcl_Size endSpace)
if (capacity == 0) {
return listObj;
}
+ if (capacity > LIST_MAX) {
+ return NULL;
+ }
ListRepInit(capacity, NULL, 0, &listRep);
ListStore *storePtr = listRep.storePtr;
- Tcl_Size i;
+ size_t i;
for (i = 0; i < length; ++i) {
TclNewUIntObj(storePtr->slots[i + leadingSpace], i);
Tcl_IncrRefCount(storePtr->slots[i + leadingSpace]);
diff --git a/generic/tclTest.c b/generic/tclTest.c
index f175c01..536a099 100644
--- a/generic/tclTest.c
+++ b/generic/tclTest.c
@@ -3089,12 +3089,28 @@ TestlinkCmd(
tmp = Tcl_NewWideIntObj(longVar);
Tcl_AppendElement(interp, Tcl_GetString(tmp));
Tcl_DecrRefCount(tmp);
- tmp = Tcl_NewWideIntObj((long)ulongVar);
+ if (ulongVar > WIDE_MAX) {
+ mp_int bignumValue;
+ if (mp_init_u64(&bignumValue, ulongVar) != MP_OKAY) {
+ Tcl_Panic("%s: memory overflow", "Tcl_SetWideUIntObj");
+ }
+ tmp = Tcl_NewBignumObj(&bignumValue);
+ } else {
+ tmp = Tcl_NewWideIntObj((Tcl_WideInt)ulongVar);
+ }
Tcl_AppendElement(interp, Tcl_GetString(tmp));
Tcl_DecrRefCount(tmp);
Tcl_PrintDouble(NULL, (double)floatVar, buffer);
Tcl_AppendElement(interp, buffer);
- tmp = Tcl_NewWideIntObj((Tcl_WideInt)uwideVar);
+ if (uwideVar > WIDE_MAX) {
+ mp_int bignumValue;
+ if (mp_init_u64(&bignumValue, uwideVar) != MP_OKAY) {
+ Tcl_Panic("%s: memory overflow", "Tcl_SetWideUIntObj");
+ }
+ tmp = Tcl_NewBignumObj(&bignumValue);
+ } else {
+ tmp = Tcl_NewWideIntObj((Tcl_WideInt)uwideVar);
+ }
Tcl_AppendElement(interp, Tcl_GetString(tmp));
Tcl_DecrRefCount(tmp);
} else if (strcmp(argv[1], "set") == 0) {
@@ -3500,24 +3516,28 @@ TestlistrepCmd(
Tcl_WrongNumArgs(interp, 2, objv, "length ?leadSpace endSpace?");
return TCL_ERROR;
} else {
- Tcl_WideInt length;
- Tcl_WideInt leadSpace = 0;
- Tcl_WideInt endSpace = 0;
- if (Tcl_GetWideIntFromObj(interp, objv[2], &length) != TCL_OK) {
+ Tcl_WideUInt length;
+ Tcl_WideUInt leadSpace = 0;
+ Tcl_WideUInt endSpace = 0;
+ if (Tcl_GetWideUIntFromObj(interp, objv[2], &length) != TCL_OK) {
return TCL_ERROR;
}
if (objc > 3) {
- if (Tcl_GetWideIntFromObj(interp, objv[3], &leadSpace) != TCL_OK) {
+ if (Tcl_GetWideUIntFromObj(interp, objv[3], &leadSpace) != TCL_OK) {
return TCL_ERROR;
}
if (objc > 4) {
- if (Tcl_GetWideIntFromObj(interp, objv[4], &endSpace)
+ if (Tcl_GetWideUIntFromObj(interp, objv[4], &endSpace)
!= TCL_OK) {
return TCL_ERROR;
}
}
}
resultObj = TclListTestObj(length, leadSpace, endSpace);
+ if (resultObj == NULL) {
+ Tcl_AppendResult(interp, "List capacity exceeded", NULL);
+ return TCL_ERROR;
+ }
}
break;
diff --git a/tests/link.test b/tests/link.test
index 69ebb02..43a85fb 100644
--- a/tests/link.test
+++ b/tests/link.test
@@ -71,7 +71,7 @@ test link-2.1 {writing C variables from Tcl} -constraints {testlink} -setup {
set float 1.0987654321
set uwide 12345678901234567890
concat [testlink get] | $int $real $bool $string $wide $char $uchar $short $ushort $uint $long $ulong $float $uwide
-} -result {465 -10.5 1 abcdef 135135 79 161 8000 40000 -1073628482 34543 567890 1.0987653732299805 -6101065172474983726 | 0o0721 -10.5 true abcdef 135135 79 161 8000 40000 0xc001babe 34543 567890 1.0987654321 12345678901234567890}
+} -result {465 -10.5 1 abcdef 135135 79 161 8000 40000 -1073628482 34543 567890 1.0987653732299805 12345678901234567890 | 0o0721 -10.5 true abcdef 135135 79 161 8000 40000 0xc001babe 34543 567890 1.0987654321 12345678901234567890}
test link-2.2 {writing bad values into variables} -setup {
testlink delete
} -constraints {testlink} -body {