diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2007-08-06 15:43:17 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2007-08-06 15:43:17 +0000 |
commit | 46611179112d69a53690a8ffd366a7d35915aeda (patch) | |
tree | e3a224fe619c892c7e33174cdb0e2a6f7039b9b0 /libbb | |
parent | eea72123a36df9e93b55989ee9c77ba764e88485 (diff) | |
download | busybox-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.c | 38 |
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 | */ |
42 | void bb_uuencode(char *store, const void *src, int length, const char *tbl) | 42 | void 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 | } |