aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--binary.tcl4
-rw-r--r--tests/binary-scan.test15
2 files changed, 17 insertions, 2 deletions
diff --git a/binary.tcl b/binary.tcl
index 5e9ae3f..cc9c9ea 100644
--- a/binary.tcl
+++ b/binary.tcl
@@ -125,7 +125,7 @@ proc "binary scan" {value formatString {args varName}} {
set n 1
}
if {$n > $rembytes} {
- continue
+ break
}
set var [binary.nextarg varName]
@@ -148,7 +148,7 @@ proc "binary scan" {value formatString {args varName}} {
}
}
if {$n * $size > $rembytes * 8} {
- continue
+ break
}
if {$type ne "int"} {
diff --git a/tests/binary-scan.test b/tests/binary-scan.test
index c758f05..ec6c95c 100644
--- a/tests/binary-scan.test
+++ b/tests/binary-scan.test
@@ -74,6 +74,13 @@ test binary-20.9 {Tcl_BinaryObjCmd: scan} -setup {
list [binary scan abc a arg1(a)] $arg1(a)
} -result {1 a}
+# As soon as a conversion runs out of bytes, scan should stop
+test binary-20.10 {Tcl_BinaryObjCmd: scan, too few bytes} -setup {
+ unset -nocomplain arg1 arg2
+} -body {
+ list [binary scan abc a5a2 arg1 arg2] [info exists arg1] [info exists arg2]
+} -result {0 0 0}
+
test binary-21.1 {Tcl_BinaryObjCmd: scan} -returnCodes error -body {
binary scan abc A
} -result {not enough arguments for all format specifiers}
@@ -185,6 +192,14 @@ test binary-22.11 {Tcl_BinaryObjCmd: scan} -setup {
list [binary scan \x07\x87\x05 b5b* arg1 arg2] $arg1 $arg2
} -result {2 11100 1110000110100000}
+# As soon as a conversion runs out of bytes, scan should stop
+test binary-20.12 {Tcl_BinaryObjCmd: scan, too few bytes} {
+ unset -nocomplain arg1 arg2
+ set arg1 foo
+ set arg2 bar
+ list [binary scan \x52 b14b8 arg1 arg2] $arg1 $arg2
+} {0 foo bar}
+
test binary-23.1 {Tcl_BinaryObjCmd: scan} -returnCodes error -body {
binary scan abc B
} -result {not enough arguments for all format specifiers}