Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | [Bug 3033307]: fix [binary decode base64] whitespace handling with '=' suffixes |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
15e6f87e78d952d0de03a5199854d0c2 |
User & Date: | dkf 2012-11-20 12:11:57 |
Context
2012-11-22
| ||
08:49 | Fix bug reported by Brian Griffin: check-in: 181caa1a57 user: jan.nijtmans tags: trunk | |
04:07 | Adding: * generic/tclVexpr.tcl - Script to build tclVexpr.c and vexpr.n * generic/tclVexpr.c - F... check-in: 7fcc65a8ad user: hypnotoad tags: hypnotoad-vexpr | |
2012-11-20
| ||
12:11 | [Bug 3033307]: fix [binary decode base64] whitespace handling with '=' suffixes check-in: 15e6f87e78 user: dkf tags: trunk | |
12:04 | very minor style tweaks Closed-Leaf check-in: d83ade012e user: dkf tags: bug-3033307 | |
2012-11-19
| ||
22:08 | [Bug 3588366]: Corrected implementation of bounds restriction for end-indexed compiled [string range... check-in: 2af48a01bb user: dkf tags: trunk | |
Changes
Changes to ChangeLog.
1 2 3 4 5 6 7 | 2012-11-19 Donal K. Fellows <[email protected]> * generic/tclExecute.c (INST_STR_RANGE_IMM): [Bug 3588366]: Corrected implementation of bounds restriction for end-indexed compiled [string range]. Thanks to Emiliano Gavilan for diagnosis and fix. 2012-11-15 Jan Nijtmans <[email protected]> | > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 | 2012-11-20 Donal K. Fellows <[email protected]> * generic/tclBinary.c (BinaryDecode64): [Bug 3033307]: Corrected handling of trailing whitespace when decoding base64. Thanks to Anton Kovalenko for reporting, and Andy Goth for the fix and tests. 2012-11-19 Donal K. Fellows <[email protected]> * generic/tclExecute.c (INST_STR_RANGE_IMM): [Bug 3588366]: Corrected implementation of bounds restriction for end-indexed compiled [string range]. Thanks to Emiliano Gavilan for diagnosis and fix. 2012-11-15 Jan Nijtmans <[email protected]> |
︙ | ︙ |
Changes to generic/tclBinary.c.
︙ | ︙ | |||
2654 2655 2656 2657 2658 2659 2660 | BinaryDecode64( ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { Tcl_Obj *resultObj = NULL; | | | | 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 | BinaryDecode64( ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *const objv[]) { Tcl_Obj *resultObj = NULL; unsigned char *data, *datastart, *dataend, c = '\0'; unsigned char *begin = NULL; unsigned char *cursor = NULL; int strict = 0; int i, index, size, cut = 0, count = 0; enum { OPT_STRICT }; static const char *const optStrings[] = { "-strict", NULL }; if (objc < 2 || objc > 3) { Tcl_WrongNumArgs(interp, 1, objv, "data"); return TCL_ERROR; } for (i = 1; i < objc-1; ++i) { |
︙ | ︙ | |||
2687 2688 2689 2690 2691 2692 2693 | TclGetStringFromObj(objv[objc-1], &count); dataend = data + count; size = ((count + 3) & ~3) * 3 / 4; begin = cursor = Tcl_SetByteArrayLength(resultObj, size); while (data < dataend) { unsigned long value = 0; | > > > > > > > | > > > > > > > > > > > > | > > > > > > > > > > > > > > > > > | | | | | | | | | | | | < | < < | | | | < < < < < | > > > > > | | > > > > > > > > > | 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 | TclGetStringFromObj(objv[objc-1], &count); dataend = data + count; size = ((count + 3) & ~3) * 3 / 4; begin = cursor = Tcl_SetByteArrayLength(resultObj, size); while (data < dataend) { unsigned long value = 0; /* * Decode the current block. Each base64 block consists of four input * characters A-Z, a-z, 0-9, +, or /. Each character supplies six bits * of output data, so each block's output is 24 bits (three bytes) in * length. The final block can be shorter by one or two bytes, denoted * by the input ending with one or two ='s, respectively. */ for (i = 0; i < 4; i++) { /* * Get the next input character. At end of input, pad with at most * two ='s. If more than two ='s would be needed, instead discard * the block read thus far. */ if (data < dataend) { c = *data++; } else if (i > 1) { c = '='; } else { cut += 3; break; } /* * Load the character into the block value. Handle ='s specially * because they're only valid as the last character or two of the * final block of input. Unless strict mode is enabled, skip any * input whitespace characters. */ if (cut) { if (c == '=' && i > 1) { value <<= 6; cut++; } else if (!strict && isspace(c)) { i--; } else { goto bad64; } } else if (c >= 'A' && c <= 'Z') { value = (value << 6) | ((c - 'A') & 0x3f); } else if (c >= 'a' && c <= 'z') { value = (value << 6) | ((c - 'a' + 26) & 0x3f); } else if (c >= '0' && c <= '9') { value = (value << 6) | ((c - '0' + 52) & 0x3f); } else if (c == '+') { value = (value << 6) | 0x3e; } else if (c == '/') { value = (value << 6) | 0x3f; } else if (c == '=') { value <<= 6; cut++; } else if (strict || !isspace(c)) { goto bad64; } else { i--; } } *cursor++ = UCHAR((value >> 16) & 0xff); *cursor++ = UCHAR((value >> 8) & 0xff); *cursor++ = UCHAR(value & 0xff); /* * Since = is only valid within the final block, if it was encountered * but there are still more input characters, confirm that strict mode * is off and all subsequent characters are whitespace. */ if (cut && data < dataend) { if (strict) { goto bad64; } for (; data < dataend; data++) { if (!isspace(*data)) { goto bad64; } } } } Tcl_SetByteArrayLength(resultObj, cursor - begin - cut); Tcl_SetObjResult(interp, resultObj); return TCL_OK; bad64: Tcl_SetObjResult(interp, Tcl_ObjPrintf( |
︙ | ︙ |
Changes to tests/binary.test.
︙ | ︙ | |||
2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 | test binary-73.23 {binary decode base64} -body { set r [binary decode base64 YWJj] list [string length $r] $r } -result {3 abc} test binary-73.24 {binary decode base64} -body { string length [binary decode base64 " "] } -result 0 test binary-74.1 {binary encode uuencode} -body { binary encode uuencode } -returnCodes error -match glob -result "wrong # args: *" test binary-74.2 {binary encode uuencode} -body { binary encode uuencode abc } -result {86)C} | > > > > > > > > > > > > > > > > > > > > > | 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 | test binary-73.23 {binary decode base64} -body { set r [binary decode base64 YWJj] list [string length $r] $r } -result {3 abc} test binary-73.24 {binary decode base64} -body { string length [binary decode base64 " "] } -result 0 test binary-73.25 {binary decode base64} -body { list [string length [set r [binary decode base64 WA==\n]]] $r } -result {1 X} test binary-73.26 {binary decode base64} -body { list [string length [set r [binary decode base64 WFk=\n]]] $r } -result {2 XY} test binary-73.27 {binary decode base64} -body { list [string length [set r [binary decode base64 WFla\n]]] $r } -result {3 XYZ} test binary-73.28 {binary decode base64} -body { list [string length [set r [binary decode base64 -strict WA==\n]]] $r } -returnCodes error -match glob -result {invalid base64 character *} test binary-73.29 {binary decode base64} -body { list [string length [set r [binary decode base64 -strict WFk=\n]]] $r } -returnCodes error -match glob -result {invalid base64 character *} test binary-73.30 {binary decode base64} -body { list [string length [set r [binary decode base64 -strict WFla\n]]] $r } -returnCodes error -match glob -result {invalid base64 character *} test binary-73.31 {binary decode base64} -body { list [string length [set r [binary decode base64 WA==WFla]]] $r } -returnCodes error -match glob -result {invalid base64 character *} test binary-74.1 {binary encode uuencode} -body { binary encode uuencode } -returnCodes error -match glob -result "wrong # args: *" test binary-74.2 {binary encode uuencode} -body { binary encode uuencode abc } -result {86)C} |
︙ | ︙ |