summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2022-03-08 17:12:28 (GMT)
committerdgp <dgp@users.sourceforge.net>2022-03-08 17:12:28 (GMT)
commit77d395c7f814d2a2d784c06b197ea84fc03ab213 (patch)
treee09193f6fcae8020652bddfb62c31909f5a93fc7
parent94033c98698f9311df88190fad45f190b4b829a8 (diff)
downloadtcl-77d395c7f814d2a2d784c06b197ea84fc03ab213.zip
tcl-77d395c7f814d2a2d784c06b197ea84fc03ab213.tar.gz
tcl-77d395c7f814d2a2d784c06b197ea84fc03ab213.tar.bz2
Backport fix and test for typecasting bug in Tcl_GetUniChar().
-rw-r--r--generic/tclStringObj.c4
-rw-r--r--tests/string.test7
2 files changed, 9 insertions, 2 deletions
diff --git a/generic/tclStringObj.c b/generic/tclStringObj.c
index d1e709c..4afd12a 100644
--- a/generic/tclStringObj.c
+++ b/generic/tclStringObj.c
@@ -576,7 +576,7 @@ Tcl_GetUniChar(
TclNumUtfChars(stringPtr->numChars, objPtr->bytes, objPtr->length);
}
if (stringPtr->numChars == objPtr->length) {
- return (Tcl_UniChar) objPtr->bytes[index];
+ return (unsigned char) objPtr->bytes[index];
}
FillUnicodeRep(objPtr);
stringPtr = GET_STRING(objPtr);
@@ -632,7 +632,7 @@ TclGetUCS4(
TclNumUtfChars(stringPtr->numChars, objPtr->bytes, objPtr->length);
}
if (stringPtr->numChars == objPtr->length) {
- return (Tcl_UniChar) objPtr->bytes[index];
+ return (unsigned char) objPtr->bytes[index];
}
FillUnicodeRep(objPtr);
stringPtr = GET_STRING(objPtr);
diff --git a/tests/string.test b/tests/string.test
index 66eb6ad..977e875 100644
--- a/tests/string.test
+++ b/tests/string.test
@@ -323,6 +323,13 @@ test string-5.20 {string index, bytearray object out of bounds} {
string index [binary format I* {0x50515253 0x52}] 20
} {}
+test string-5.22 {string index} -constraints testbytestring -setup {
+ set string string
+} -body {
+ list [scan [$string index [testbytestring \xFF] 0] %c var] $var
+} -cleanup {
+ unset string
+} -result {1 255}
proc largest_int {} {
# This will give us what the largest valid int on this machine is,