[EMAIL PROTECTED] writes:

> I discovered a buffer overflow bug in the base64_encode() function,
> located at line 1905 in file src\utils.c.  Note that this bug is in the
> latest version of the program (version 1.10.2)  The bug appears to be that
> the function is assuming that the input data is a size that is an even
> multiple of 3 bytes.  No doubt this is due to the fact that the base 64
> algorithm is converting data to base 64 three bytes at a time.  The
> problem here is that if the block of data is not an even multiple of 3
> bytes, then the last group of bytes will be either 1 or 2 bytes long. 
> This means that the only the last 1 or 2 bytes should be used in the base
> 64 algorithm.

You're right; thanks for reporting this.  I have now installed this fix:


2006-06-19  Hrvoje Niksic  <[EMAIL PROTECTED]>

        * utils.c (base64_encode): Would read past end of STR.
        Reported by [EMAIL PROTECTED]

Index: src/utils.c
===================================================================
--- src/utils.c (revision 2151)
+++ src/utils.c (working copy)
@@ -1912,26 +1912,35 @@
     'w','x','y','z','0','1','2','3',
     '4','5','6','7','8','9','+','/'
   };
-  int i;
   const unsigned char *s = (const unsigned char *) str;
+  const unsigned char *end = (const unsigned char *) str + length - 2;
   char *p = b64store;
 
   /* Transform the 3x8 bits to 4x6 bits, as required by base64.  */
-  for (i = 0; i < length; i += 3)
+  for (; s < end; s += 3)
     {
       *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];
-      s += 3;
     }
 
   /* Pad the result if necessary...  */
-  if (i == length + 1)
-    *(p - 1) = '=';
-  else if (i == length + 2)
-    *(p - 1) = *(p - 2) = '=';
-
+  switch (length % 3)
+    {
+    case 1:
+      *p++ = tbl[s[0] >> 2];
+      *p++ = tbl[(s[0] & 3) << 4];
+      *p++ = '=';
+      *p++ = '=';
+      break;
+    case 2:
+      *p++ = tbl[s[0] >> 2];
+      *p++ = tbl[((s[0] & 3) << 4) + (s[1] >> 4)];
+      *p++ = tbl[((s[1] & 0xf) << 2)];
+      *p++ = '=';
+      break;
+    }
   /* ...and zero-terminate it.  */
   *p = '\0';
 

Reply via email to