Commit c45c24ed authored by lars@mysql.com's avatar lars@mysql.com

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.
parent 531b847f
......@@ -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)));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment