kore

An easy to use, scalable and secure web application framework for writing web APIs in C.
Commits | Files | Refs | README | LICENSE | git clone https://git.kore.io/kore.git

commit 332e8f4ba0363ba816109a51a8e46ef37056dde7
parent c14f3031ff7cac76c40517b3a8e690759c6df05f
Author: Joris Vink <joris@coders.se>
Date:   Tue, 22 Apr 2014 21:45:26 +0200

Do a better job at base64 decoding stuff

Diffstat:
src/utils.c | 16+++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/src/utils.c b/src/utils.c @@ -35,7 +35,7 @@ static struct { { NULL, 0 }, }; -static char b64table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; +static char b64table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; void kore_debug_internal(char *file, int line, const char *fmt, ...) @@ -345,6 +345,9 @@ kore_base64_decode(char *in, u_int8_t **out, u_int32_t *olen) res = kore_buf_create(len); for (idx = 0; idx < len; idx++) { + if (in[idx] == '=') + break; + for (o = 0; o < sizeof(b64table); o++) { if (b64table[o] == in[idx]) { d = o; @@ -352,9 +355,8 @@ kore_base64_decode(char *in, u_int8_t **out, u_int32_t *olen) } } - /* XXX - This could be bad? */ if (o == sizeof(b64table)) - d = 0; + fatal("bad b64 character: %c", in[idx]); b |= (d & 0x3f) << (i * 6); if (i-- == 0) { @@ -368,6 +370,14 @@ kore_base64_decode(char *in, u_int8_t **out, u_int32_t *olen) } } + o = len - idx; + if (o > 0) { + for (i = 2; i >= o; i--) { + n = (b >> (8 * i)); + kore_buf_append(res, &n, 1); + } + } + *out = kore_buf_release(res, olen); return (KORE_RESULT_OK); }