summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--generic/tclBinary.c32
-rw-r--r--tests/binary.test8
2 files changed, 35 insertions, 5 deletions
diff --git a/generic/tclBinary.c b/generic/tclBinary.c
index 33b1e3e..6306159 100644
--- a/generic/tclBinary.c
+++ b/generic/tclBinary.c
@@ -2649,7 +2649,37 @@ BinaryEncodeUu(
lineLength = ((lineLength - 1) & -4) + 1; /* 5, 9, 13 ... */
break;
case OPT_WRAPCHAR:
- wrapchar = Tcl_GetByteArrayFromObj(objv[i + 1], &wrapcharlen);
+ wrapchar = (const unsigned char *) TclGetStringFromObj(
+ objv[i + 1], &wrapcharlen);
+ {
+ const unsigned char *p = wrapchar;
+ int numBytes = wrapcharlen;
+
+ while (numBytes) {
+ switch (*p) {
+ case '\t':
+ case '\v':
+ case '\f':
+ case '\r':
+ p++; numBytes--;
+ continue;
+ case '\n':
+ numBytes--;
+ break;
+ default:
+ badwrap:
+ Tcl_SetObjResult(interp, Tcl_NewStringObj(
+ "invalid wrapchar; will defeat decoding",
+ -1));
+ Tcl_SetErrorCode(interp, "TCL", "BINARY",
+ "ENCODE", "WRAPCHAR", NULL);
+ return TCL_ERROR;
+ }
+ }
+ if (numBytes) {
+ goto badwrap;
+ }
+ }
break;
}
}
diff --git a/tests/binary.test b/tests/binary.test
index 480532c..c2c5eb4 100644
--- a/tests/binary.test
+++ b/tests/binary.test
@@ -2797,11 +2797,11 @@ test binary-74.11 {binary encode uuencode} -returnCodes error -body {
binary encode uuencode -maxlen 4 abcabcabc
} -result {line length out of range}
test binary-74.12 {binary encode uuencode} -body {
- binary encode uuencode -maxlen 5 -wrapchar | abcabcabc
-} -result {#86)C|#86)C|#86)C|}
+ binary encode uuencode -maxlen 5 -wrapchar \t abcabcabc
+} -result #86)C\t#86)C\t#86)C\t
test binary-74.13 {binary encode uuencode} -body {
- binary encode uuencode -maxlen 85 -wrapchar | abcabcabc
-} -result {)86)C86)C86)C|}
+ binary encode uuencode -maxlen 85 -wrapchar \t abcabcabc
+} -result )86)C86)C86)C\t
test binary-74.14 {binary encode uuencode} -returnCodes error -body {
binary encode uuencode -maxlen 86 abcabcabc
} -result {line length out of range}