svn commit: trunk/busybox: libbb networking

vda at busybox.net vda at busybox.net
Mon Aug 6 15:43:19 UTC 2007


Author: vda
Date: 2007-08-06 08:43:17 -0700 (Mon, 06 Aug 2007)
New Revision: 19413

Log:
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



Modified:
   trunk/busybox/libbb/uuencode.c
   trunk/busybox/networking/wget.c


Changeset:
Modified: trunk/busybox/libbb/uuencode.c
===================================================================
--- trunk/busybox/libbb/uuencode.c	2007-08-06 13:34:10 UTC (rev 19412)
+++ trunk/busybox/libbb/uuencode.c	2007-08-06 15:43:17 UTC (rev 19413)
@@ -39,27 +39,33 @@
  * 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];
+	/* Zero-terminate */
+	*p = '\0';
+	/* If length is -2 or -1, pad last char or two */
+	while (length) {
+		*--p = tbl[64];
+		length++;
 	}
-	else if (i == length + 2) {
-		*(p - 1) = *(p - 2) = tbl[64];
-	}
-	/* ...and zero-terminate it.  */
-	*p = '\0';
 }

Modified: trunk/busybox/networking/wget.c
===================================================================
--- trunk/busybox/networking/wget.c	2007-08-06 13:34:10 UTC (rev 19412)
+++ trunk/busybox/networking/wget.c	2007-08-06 15:43:17 UTC (rev 19413)
@@ -109,9 +109,9 @@
 	FILE *sfp = NULL;               /* socket to web/ftp server         */
 	FILE *dfp = NULL;               /* socket to ftp server (data)      */
 	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;
-	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 *user_agent = "Wget";/* "User-Agent" header field        */
 	static const char keywords[] =




More information about the busybox-cvs mailing list