summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2011-09-01 17:13:59 (GMT)
committerdgp <dgp@users.sourceforge.net>2011-09-01 17:13:59 (GMT)
commitc639e72c38ffbe038a79a58991d4c5bb3e027a6f (patch)
tree958809c8acbbd29e5562804b7f60bf29c9d3e7b3
parent2cd90e85bdaacea5b5fcf05011e14b92d78b5b12 (diff)
downloadtcl-c639e72c38ffbe038a79a58991d4c5bb3e027a6f.zip
tcl-c639e72c38ffbe038a79a58991d4c5bb3e027a6f.tar.gz
tcl-c639e72c38ffbe038a79a58991d4c5bb3e027a6f.tar.bz2
3402540 Corrections to TclParseNumber() to make it reject invalid Nan(Hex)
[scan Inf %g] is portable; remove constraint.
-rw-r--r--ChangeLog7
-rwxr-xr-xgeneric/tclStrToD.c3
-rw-r--r--tests/binary.test18
-rw-r--r--tests/scan.test4
4 files changed, 30 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 9bec595..cb877b7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2011-09-01 Don Porter <dgp@users.sourceforge.net>
+
+ * generic/tclStrToD.c: [Bug 3402540] Corrections to TclParseNumber()
+ * tests/binary.test: to make it reject invalid Nan(Hex) strings.
+
+ * tests/scan.test: [scan Inf %g] is portable; remove constraint.
+
2011-08-30 Donal K. Fellows <dkf@users.sf.net>
* generic/tclInterp.c (SlaveCommandLimitCmd, SlaveTimeLimitCmd):
diff --git a/generic/tclStrToD.c b/generic/tclStrToD.c
index aa78c51..c942023 100755
--- a/generic/tclStrToD.c
+++ b/generic/tclStrToD.c
@@ -1060,7 +1060,10 @@ TclParseNumber(
d = 10 + c - 'a';
} else if (c >= 'A' && c <= 'F') {
d = 10 + c - 'A';
+ } else {
+ goto endgame;
}
+ numSigDigs++;
significandWide = (significandWide << 4) + d;
state = sNANHEX;
break;
diff --git a/tests/binary.test b/tests/binary.test
index 44af9e5..e43b9f4 100644
--- a/tests/binary.test
+++ b/tests/binary.test
@@ -2356,6 +2356,24 @@ test binary-63.4 {NaN} ieeeFloatingPoint {
binary scan [binary format q {NaN( 3123456789aBc)}] w w
format 0x%016lx [expr {$w & 0xfff3ffffffffffff}]
} 0x7ff3123456789abc
+
+# Make sure TclParseNumber() rejects invalid nan-hex formats [Bug 3402540]
+test binary-63.5 {NaN} -constraints ieeeFloatingPoint -body {
+ binary format q Nan(
+} -returnCodes error -match glob -result {expected floating-point number*}
+test binary-63.6 {NaN} -constraints ieeeFloatingPoint -body {
+ binary format q Nan()
+} -returnCodes error -match glob -result {expected floating-point number*}
+test binary-63.7 {NaN} -constraints ieeeFloatingPoint -body {
+ binary format q Nan(g)
+} -returnCodes error -match glob -result {expected floating-point number*}
+test binary-63.8 {NaN} -constraints ieeeFloatingPoint -body {
+ binary format q Nan(1,2)
+} -returnCodes error -match glob -result {expected floating-point number*}
+test binary-63.9 {NaN} -constraints ieeeFloatingPoint -body {
+ binary format q Nan(1234567890abcd)
+} -returnCodes error -match glob -result {expected floating-point number*}
+
test binary-64.1 {NaN} \
-constraints ieeeFloatingPoint \
-body {
diff --git a/tests/scan.test b/tests/scan.test
index b37ce0c..34351e0 100644
--- a/tests/scan.test
+++ b/tests/scan.test
@@ -749,11 +749,11 @@ testConstraint ieeeFloatingPoint [testIEEE]
# scan infinities - not working
-test scan-14.1 {infinity} ieeeFloatingPoint {
+test scan-14.1 {infinity} {
scan Inf %g d
set d
} Inf
-test scan-14.2 {infinity} ieeeFloatingPoint {
+test scan-14.2 {infinity} {
scan -Inf %g d
set d
} -Inf