Merged revisions 228378 via svnmerge from
authorMatthew Nicholson <mnicholson@digium.com>
Fri, 6 Nov 2009 19:47:11 +0000 (19:47 +0000)
committerMatthew Nicholson <mnicholson@digium.com>
Fri, 6 Nov 2009 19:47:11 +0000 (19:47 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
  r228378 | mnicholson | 2009-11-06 10:26:59 -0600 (Fri, 06 Nov 2009) | 8 lines

  Properly handle '=' while decoding base64 messages and null terminate strings returned from BASE64_DECODE.

  (closes issue #15271)
  Reported by: chappell
  Patches:
        base64_fix.patch uploaded by chappell (license 8)
  Tested by: kobaz
........

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@228620 65c4cc65-6c06-0410-ace0-fbb531ad65f3

funcs/func_base64.c
main/utils.c

index a68cf9b..34c6ec6 100644 (file)
@@ -79,13 +79,26 @@ static int base64_helper(struct ast_channel *chan, const char *cmd, char *data,
                        ast_str_update(*str);
                }
        } else {
                        ast_str_update(*str);
                }
        } else {
+               int decoded_len;
                if (buf) {
                if (buf) {
-                       ast_base64decode((unsigned char *) buf, data, len);
+                       decoded_len = ast_base64decode((unsigned char *) buf, data, len);
+                       /* add a terminating null at the end of buf, or at the
+                        * end of our decoded string, which ever is less */
+                       buf[decoded_len <= (len - 1) ? decoded_len : len - 1] = '\0';
                } else {
                        if (len >= 0) {
                                ast_str_make_space(str, len ? len : ast_str_strlen(*str) + strlen(data) * 3 / 4 + 2);
                        }
                } else {
                        if (len >= 0) {
                                ast_str_make_space(str, len ? len : ast_str_strlen(*str) + strlen(data) * 3 / 4 + 2);
                        }
-                       ast_base64decode((unsigned char *) ast_str_buffer(*str) + ast_str_strlen(*str), data, ast_str_size(*str) - ast_str_strlen(*str));
+                       decoded_len = ast_base64decode((unsigned char *) ast_str_buffer(*str) + ast_str_strlen(*str), data, ast_str_size(*str) - ast_str_strlen(*str));
+                       if (len)
+                               /* add a terminating null at the end of our
+                                * buffer, or at the end of our decoded string,
+                                * which ever is less */
+                               ast_str_buffer(*str)[decoded_len <= (len - 1) ? decoded_len : len - 1] = '\0';
+                       else
+                               /* space for the null is allocated above */
+                               ast_str_buffer(*str)[decoded_len] = '\0';
+
                        ast_str_update(*str);
                }
        }
                        ast_str_update(*str);
                }
        }
index b50fabc..e0005a6 100644 (file)
@@ -267,7 +267,7 @@ int ast_base64decode(unsigned char *dst, const char *src, int max)
        unsigned int byte = 0;
        unsigned int bits = 0;
        int incnt = 0;
        unsigned int byte = 0;
        unsigned int bits = 0;
        int incnt = 0;
-       while (*src && (cnt < max)) {
+       while(*src && *src != '=' && (cnt < max)) {
                /* Shift in 6 bits of input */
                byte <<= 6;
                byte |= (b2a[(int)(*src)]) & 0x3f;
                /* Shift in 6 bits of input */
                byte <<= 6;
                byte |= (b2a[(int)(*src)]) & 0x3f;