summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsebres <sebres@users.sourceforge.net>2018-11-15 22:31:39 (GMT)
committersebres <sebres@users.sourceforge.net>2018-11-15 22:31:39 (GMT)
commitd1e5b0f72f8fd4f57590893488e6fd2df7fba2d2 (patch)
tree90b4a92acba5f9fe296ff7e4acf819e1718476aa
parentdca8be01de6f8cc44135c0528bba0fc4d25c3a44 (diff)
downloadtcl-d1e5b0f72f8fd4f57590893488e6fd2df7fba2d2.zip
tcl-d1e5b0f72f8fd4f57590893488e6fd2df7fba2d2.tar.gz
tcl-d1e5b0f72f8fd4f57590893488e6fd2df7fba2d2.tar.bz2
fixes segfault [00d04c4f12], unfulfilled base64 (strict and non-strict mode, etc).
-rw-r--r--generic/tclBinary.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/generic/tclBinary.c b/generic/tclBinary.c
index bb918f2..571eb07 100644
--- a/generic/tclBinary.c
+++ b/generic/tclBinary.c
@@ -2914,6 +2914,11 @@ BinaryDecode64(
} else if (i > 1) {
c = '=';
} else {
+ if (strict && i <= 1) {
+ /* single resp. unfulfilled char (each 4th next single char)
+ * is rather bad64 error case in strict mode */
+ goto bad64;
+ }
cut += 3;
break;
}
@@ -2944,9 +2949,11 @@ BinaryDecode64(
value = (value << 6) | 0x3e;
} else if (c == '/') {
value = (value << 6) | 0x3f;
- } else if (c == '=') {
+ } else if (c == '=' && (
+ !strict || i > 1) /* "=" and "a=" is rather bad64 error case in strict mode */
+ ) {
value <<= 6;
- cut++;
+ if (i) cut++;
} else if (strict || !isspace(c)) {
goto bad64;
} else {