From 46611179112d69a53690a8ffd366a7d35915aeda Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Mon, 6 Aug 2007 15:43:17 +0000 Subject: 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 --- libbb/uuencode.c | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) (limited to 'libbb') 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] = { * buffer of at least 1+BASE64_LENGTH(length) bytes. * where BASE64_LENGTH(len) = (4 * ((LENGTH + 2) / 3)) */ -void bb_uuencode(char *store, const void *src, int length, const char *tbl) +void bb_uuencode(char *p, const void *src, int length, const char *tbl) { - int i; const unsigned char *s = src; - char *p = store; - /* Transform the 3x8 bits to 4x6 bits, as required by base64. */ - for (i = 0; i < length; i += 3) { + /* Transform the 3x8 bits to 4x6 bits */ + while (length > 0) { + unsigned s1, s2; + + /* Are s[1], s[2] valid or should be assumed 0? */ + s1 = s2 = 0; + length -= 3; /* can be >=0, -1, -2 */ + if (length != -2) { + s1 = s[1]; + if (length != -1) + s2 = s[2]; + } *p++ = tbl[s[0] >> 2]; - *p++ = tbl[((s[0] & 3) << 4) + (s[1] >> 4)]; - *p++ = tbl[((s[1] & 0xf) << 2) + (s[2] >> 6)]; - *p++ = tbl[s[2] & 0x3f]; + *p++ = tbl[((s[0] & 3) << 4) + (s1 >> 4)]; + *p++ = tbl[((s1 & 0xf) << 2) + (s2 >> 6)]; + *p++ = tbl[s2 & 0x3f]; s += 3; } - /* Pad the result if necessary... */ - if (i == length + 1) { - *(p - 1) = tbl[64]; - } - else if (i == length + 2) { - *(p - 1) = *(p - 2) = tbl[64]; - } - /* ...and zero-terminate it. */ + /* Zero-terminate */ *p = '\0'; + /* If length is -2 or -1, pad last char or two */ + while (length) { + *--p = tbl[64]; + length++; + } } -- cgit v1.2.3