summaryrefslogtreecommitdiff
path: root/mysys/base64.c
diff options
context:
space:
mode:
authorunknown <lars@mysql.com>2005-10-31 19:57:57 +0100
committerunknown <lars@mysql.com>2005-10-31 19:57:57 +0100
commit65784838ae577b1c8b22713b29991adb4e23e1a3 (patch)
tree63dd1d4cdccf615d1033496f0ce9911d824a8b3a /mysys/base64.c
parentd8fa981918d0a98fb83db4733542a61312fbff6c (diff)
downloadmariadb-git-65784838ae577b1c8b22713b29991adb4e23e1a3.tar.gz
Fixed failure of NDB config retrieval.
1. Made sure that base64 string is terminated with NUL. 2. Made calculation of needed size for base64 string exact. Added checks in test for the above two fixes. mysys/base64.c: Made sure that base64 string is terminated with NUL. Made calculation of needed size for base64 string exact. Added checks in test for the above two fixes.
Diffstat (limited to 'mysys/base64.c')
-rw-r--r--mysys/base64.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/mysys/base64.c b/mysys/base64.c
index 0fcd6f096f5..0165982fb67 100644
--- a/mysys/base64.c
+++ b/mysys/base64.c
@@ -27,9 +27,13 @@ static char base64_table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
int
base64_needed_encoded_length(int length_of_data)
{
- return ceil(length_of_data * 4 / 3) /* base64 chars */ +
- ceil(length_of_data / (76 * 3 / 4)) /* Newlines */ +
- 3 /* Padding */;
+ int nb_base64_chars;
+ nb_base64_chars= (length_of_data + 2) / 3 * 4;
+
+ return
+ nb_base64_chars + /* base64 char incl padding */
+ (nb_base64_chars - 1)/ 76 + /* newlines */
+ 1; /* NUL termination of string */
}
@@ -89,6 +93,7 @@ base64_encode(const void *src, size_t src_len, char *dst)
else
*dst++= base64_table[(c >> 0) & 0x3f];
}
+ *dst= '\0';
return 0;
}
@@ -209,6 +214,7 @@ main(void)
size_t j;
size_t k, l;
size_t dst_len;
+ size_t needed_length;
for (i= 0; i < 500; i++)
{
@@ -227,8 +233,12 @@ main(void)
}
/* Encode */
- str= (char *) malloc(base64_needed_encoded_length(src_len));
+ needed_length= base64_needed_encoded_length(src_len);
+ str= (char *) malloc(needed_length);
+ for (k= 0; k < needed_length; k++)
+ str[k]= 0xff; /* Fill memory to check correct NUL termination */
require(base64_encode(src, src_len, str) == 0);
+ require(needed_length == strlen(str) + 1);
/* Decode */
dst= (char *) malloc(base64_needed_decoded_length(strlen(str)));