aboutsummaryrefslogtreecommitdiff
path: root/libbb
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2007-08-06 15:43:17 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2007-08-06 15:43:17 +0000
commit46611179112d69a53690a8ffd366a7d35915aeda (patch)
treee3a224fe619c892c7e33174cdb0e2a6f7039b9b0 /libbb
parenteea72123a36df9e93b55989ee9c77ba764e88485 (diff)
downloadbusybox-w32-46611179112d69a53690a8ffd366a7d35915aeda.tar.gz
busybox-w32-46611179112d69a53690a8ffd366a7d35915aeda.tar.bz2
busybox-w32-46611179112d69a53690a8ffd366a7d35915aeda.zip
bb_uuencode: fix obscure case where we were using data past last byte of source
(fixes testsuite failure) bb_uuencode 154 160 +6 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 1/0 up/down: 6/0) Total: 6 bytes text data bss dec hex filename 770284 1096 11228 782608 bf110 busybox_old 770288 1096 11228 782612 bf114 busybox_unstripped
Diffstat (limited to 'libbb')
-rw-r--r--libbb/uuencode.c38
1 files changed, 22 insertions, 16 deletions
diff --git a/libbb/uuencode.c b/libbb/uuencode.c
index 08fe3f366..57d1cbfd2 100644
--- a/libbb/uuencode.c
+++ b/libbb/uuencode.c
@@ -39,27 +39,33 @@ const char bb_uuenc_tbl_std[65] = {
39 * buffer of at least 1+BASE64_LENGTH(length) bytes. 39 * buffer of at least 1+BASE64_LENGTH(length) bytes.
40 * where BASE64_LENGTH(len) = (4 * ((LENGTH + 2) / 3)) 40 * where BASE64_LENGTH(len) = (4 * ((LENGTH + 2) / 3))
41 */ 41 */
42void bb_uuencode(char *store, const void *src, int length, const char *tbl) 42void bb_uuencode(char *p, const void *src, int length, const char *tbl)
43{ 43{
44 int i;
45 const unsigned char *s = src; 44 const unsigned char *s = src;
46 char *p = store;
47 45
48 /* Transform the 3x8 bits to 4x6 bits, as required by base64. */ 46 /* Transform the 3x8 bits to 4x6 bits */
49 for (i = 0; i < length; i += 3) { 47 while (length > 0) {
48 unsigned s1, s2;
49
50 /* Are s[1], s[2] valid or should be assumed 0? */
51 s1 = s2 = 0;
52 length -= 3; /* can be >=0, -1, -2 */
53 if (length != -2) {
54 s1 = s[1];
55 if (length != -1)
56 s2 = s[2];
57 }
50 *p++ = tbl[s[0] >> 2]; 58 *p++ = tbl[s[0] >> 2];
51 *p++ = tbl[((s[0] & 3) << 4) + (s[1] >> 4)]; 59 *p++ = tbl[((s[0] & 3) << 4) + (s1 >> 4)];
52 *p++ = tbl[((s[1] & 0xf) << 2) + (s[2] >> 6)]; 60 *p++ = tbl[((s1 & 0xf) << 2) + (s2 >> 6)];
53 *p++ = tbl[s[2] & 0x3f]; 61 *p++ = tbl[s2 & 0x3f];
54 s += 3; 62 s += 3;
55 } 63 }
56 /* Pad the result if necessary... */ 64 /* Zero-terminate */
57 if (i == length + 1) {
58 *(p - 1) = tbl[64];
59 }
60 else if (i == length + 2) {
61 *(p - 1) = *(p - 2) = tbl[64];
62 }
63 /* ...and zero-terminate it. */
64 *p = '\0'; 65 *p = '\0';
66 /* If length is -2 or -1, pad last char or two */
67 while (length) {
68 *--p = tbl[64];
69 length++;
70 }
65} 71}