diff options
author | unknown <lars@mysql.com> | 2005-10-31 19:57:57 +0100 |
---|---|---|
committer | unknown <lars@mysql.com> | 2005-10-31 19:57:57 +0100 |
commit | 65784838ae577b1c8b22713b29991adb4e23e1a3 (patch) | |
tree | 63dd1d4cdccf615d1033496f0ce9911d824a8b3a /mysys/base64.c | |
parent | d8fa981918d0a98fb83db4733542a61312fbff6c (diff) | |
download | mariadb-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.c | 18 |
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))); |