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
This commit is contained in:
parent
eea72123a3
commit
4661117911
@ -39,27 +39,33 @@ const char bb_uuenc_tbl_std[65] = {
|
|||||||
* buffer of at least 1+BASE64_LENGTH(length) bytes.
|
* buffer of at least 1+BASE64_LENGTH(length) bytes.
|
||||||
* where BASE64_LENGTH(len) = (4 * ((LENGTH + 2) / 3))
|
* 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;
|
const unsigned char *s = src;
|
||||||
char *p = store;
|
|
||||||
|
|
||||||
/* Transform the 3x8 bits to 4x6 bits, as required by base64. */
|
/* Transform the 3x8 bits to 4x6 bits */
|
||||||
for (i = 0; i < length; i += 3) {
|
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] >> 2];
|
||||||
*p++ = tbl[((s[0] & 3) << 4) + (s[1] >> 4)];
|
*p++ = tbl[((s[0] & 3) << 4) + (s1 >> 4)];
|
||||||
*p++ = tbl[((s[1] & 0xf) << 2) + (s[2] >> 6)];
|
*p++ = tbl[((s1 & 0xf) << 2) + (s2 >> 6)];
|
||||||
*p++ = tbl[s[2] & 0x3f];
|
*p++ = tbl[s2 & 0x3f];
|
||||||
s += 3;
|
s += 3;
|
||||||
}
|
}
|
||||||
/* Pad the result if necessary... */
|
/* Zero-terminate */
|
||||||
if (i == length + 1) {
|
|
||||||
*(p - 1) = tbl[64];
|
|
||||||
}
|
|
||||||
else if (i == length + 2) {
|
|
||||||
*(p - 1) = *(p - 2) = tbl[64];
|
|
||||||
}
|
|
||||||
/* ...and zero-terminate it. */
|
|
||||||
*p = '\0';
|
*p = '\0';
|
||||||
|
/* If length is -2 or -1, pad last char or two */
|
||||||
|
while (length) {
|
||||||
|
*--p = tbl[64];
|
||||||
|
length++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -109,9 +109,9 @@ int wget_main(int argc, char **argv)
|
|||||||
FILE *sfp = NULL; /* socket to web/ftp server */
|
FILE *sfp = NULL; /* socket to web/ftp server */
|
||||||
FILE *dfp = NULL; /* socket to ftp server (data) */
|
FILE *dfp = NULL; /* socket to ftp server (data) */
|
||||||
char *fname_out = NULL; /* where to direct output (-O) */
|
char *fname_out = NULL; /* where to direct output (-O) */
|
||||||
bool got_clen = 0; /* got content-length: from server */
|
bool got_clen = 0; /* got content-length: from server */
|
||||||
int output_fd = -1;
|
int output_fd = -1;
|
||||||
bool use_proxy = 1; /* Use proxies if env vars are set */
|
bool use_proxy = 1; /* Use proxies if env vars are set */
|
||||||
const char *proxy_flag = "on"; /* Use proxies if env vars are set */
|
const char *proxy_flag = "on"; /* Use proxies if env vars are set */
|
||||||
const char *user_agent = "Wget";/* "User-Agent" header field */
|
const char *user_agent = "Wget";/* "User-Agent" header field */
|
||||||
static const char keywords[] =
|
static const char keywords[] =
|
||||||
|
Loading…
Reference in New Issue
Block a user