diff options
-rw-r--r-- | generic/tclBinary.c | 32 | ||||
-rw-r--r-- | tests/binary.test | 8 |
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} |