--- ppp-2.4.3/pppd/plugins/winbind.c.orig	2005-05-12 14:18:10.000000000 -0700
+++ ppp-2.4.3/pppd/plugins/winbind.c	2005-05-12 14:37:59.000000000 -0700
@@ -200,50 +200,41 @@
 	return num_chars;
 }
 
-static const char *b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+static const char *codes = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 
 /**
  * Encode a base64 string into a malloc()ed string caller to free.
- *
- *From SQUID: adopted from http://ftp.sunet.se/pub2/gnu/vm/base64-encode.c with adjustments
  **/
 char * base64_encode(const char *data)
 {
-	int bits = 0;
-	int char_count = 0;
-	size_t out_cnt = 0;
-	size_t len = strlen(data);
-	size_t output_len = strlen(data) * 2;
-	char *result = malloc(output_len); /* get us plenty of space */
-
-	while (len-- && out_cnt < (output_len) - 5) {
-		int c = (unsigned char) *(data++);
-		bits += c;
-		char_count++;
-		if (char_count == 3) {
-			result[out_cnt++] = b64[bits >> 18];
-			result[out_cnt++] = b64[(bits >> 12) & 0x3f];
-			result[out_cnt++] = b64[(bits >> 6) & 0x3f];
-	    result[out_cnt++] = b64[bits & 0x3f];
-	    bits = 0;
-	    char_count = 0;
-	} else {
-	    bits <<= 8;
-	}
+    int i;
+    size_t len = strlen(data);
+    size_t leven = 3*(len / 3);
+    size_t output_len = 4 * ((len + 2) / 3) + 1;
+    char *p, *result = malloc(output_len); /* get us plenty of space */
+    const char *in;
+    p = result;
+    in = data;
+    for (i = 0; i < leven; i += 3)
+    {
+        *p++ = codes[(in[0] >> 2) & 0x3F];
+        *p++ = codes[(((in[0] & 3) << 4) + (in[1] >> 4)) & 0x3F];
+        *p++ = codes[(((in[1] & 0xf) << 2) + (in[2] >> 6)) & 0x3F];
+        *p++ = codes[in[2] & 0x3F];
+        in += 3;
     }
-    if (char_count != 0) {
-	bits <<= 16 - (8 * char_count);
-	result[out_cnt++] = b64[bits >> 18];
-	result[out_cnt++] = b64[(bits >> 12) & 0x3f];
-	if (char_count == 1) {
-	    result[out_cnt++] = '=';
-	    result[out_cnt++] = '=';
-	} else {
-	    result[out_cnt++] = b64[(bits >> 6) & 0x3f];
-	    result[out_cnt++] = '=';
-	}
+    /* Pad it if necessary...  */
+    if (i < len)
+    {
+        unsigned a = in[0];
+        unsigned b = (i+1 < len) ? in[1] : 0;
+        *p++ = codes[(a >> 2) & 0x3F];
+        *p++ = codes[(((a & 3) << 4) + (b >> 4)) & 0x3F];
+        *p++ = (i+1 < len) ? codes[(((b & 0xf) << 2)) & 0x3F] : '=';
+        *p++ = '=';
     }
-    result[out_cnt] = '\0';	/* terminate */
+    /* append a NULL byte */
+    *p = '\0';
     return result;
 }
 
