diff --git a/mongoose.c b/mongoose.c index 0bb601e6..e2d9e0df 100644 --- a/mongoose.c +++ b/mongoose.c @@ -314,24 +314,18 @@ void cs_base64_finish(struct cs_base64_ctx *ctx) { while (j % 4 != 0) { \ BASE64_OUT('='); \ } \ - BASE64_FLUSH() #define BASE64_OUT(ch) \ do { \ dst[j++] = (ch); \ } while (0) -#define BASE64_FLUSH() \ - do { \ - dst[j++] = '\0'; \ - } while (0) - -void cs_base64_encode(const unsigned char *src, int src_len, char *dst) { +void cs_base64_encode(const unsigned char *src, int src_len, char *dst, int *enc_len) { BASE64_ENCODE_BODY; + if (enc_len != NULL) *enc_len = j; } #undef BASE64_OUT -#undef BASE64_FLUSH #if CS_ENABLE_STDIO #define BASE64_OUT(ch) \ @@ -340,14 +334,11 @@ void cs_base64_encode(const unsigned char *src, int src_len, char *dst) { j++; \ } while (0) -#define BASE64_FLUSH() - void cs_fprint_base64(FILE *f, const unsigned char *src, int src_len) { BASE64_ENCODE_BODY; } #undef BASE64_OUT -#undef BASE64_FLUSH #endif /* CS_ENABLE_STDIO */ /* Convert one byte of encoded base64 input stream to 6-bit chunk */ @@ -406,7 +397,6 @@ int cs_base64_decode(const unsigned char *s, int len, char *dst, int *dec_len) { if (d == 200) break; *dst++ = c << 6 | d; } - *dst = 0; if (dec_len != NULL) *dec_len = (dst - orig_dst); return orig_len - len; } @@ -10357,11 +10347,16 @@ size_t mg_fwrite(const void *ptr, size_t size, size_t count, FILE *f) { #endif void mg_base64_encode(const unsigned char *src, int src_len, char *dst) { - cs_base64_encode(src, src_len, dst); + int enc_len = 0; + cs_base64_encode(src, src_len, dst, &enc_len); + dst[enc_len] = '\0'; } int mg_base64_decode(const unsigned char *s, int len, char *dst) { - return cs_base64_decode(s, len, dst, NULL); + int dec_len = 0; + int res = cs_base64_decode(s, len, dst, &dec_len); + dst[dec_len] = '\0'; + return res; } #if MG_ENABLE_THREADS diff --git a/mongoose.h b/mongoose.h index 0491e1b9..0533bbef 100644 --- a/mongoose.h +++ b/mongoose.h @@ -2152,7 +2152,7 @@ void cs_base64_init(struct cs_base64_ctx *ctx, cs_base64_putc_t putc, void cs_base64_update(struct cs_base64_ctx *ctx, const char *str, size_t len); void cs_base64_finish(struct cs_base64_ctx *ctx); -void cs_base64_encode(const unsigned char *src, int src_len, char *dst); +void cs_base64_encode(const unsigned char *src, int src_len, char *dst, int *enc_len); void cs_fprint_base64(FILE *f, const unsigned char *src, int src_len); /* diff --git a/src/common/cs_base64.c b/src/common/cs_base64.c index 0a8fc1ef..a7fa07fe 100644 --- a/src/common/cs_base64.c +++ b/src/common/cs_base64.c @@ -101,24 +101,18 @@ void cs_base64_finish(struct cs_base64_ctx *ctx) { while (j % 4 != 0) { \ BASE64_OUT('='); \ } \ - BASE64_FLUSH() #define BASE64_OUT(ch) \ do { \ dst[j++] = (ch); \ } while (0) -#define BASE64_FLUSH() \ - do { \ - dst[j++] = '\0'; \ - } while (0) - -void cs_base64_encode(const unsigned char *src, int src_len, char *dst) { +void cs_base64_encode(const unsigned char *src, int src_len, char *dst, int *enc_len) { BASE64_ENCODE_BODY; + if (enc_len != NULL) *enc_len = j; } #undef BASE64_OUT -#undef BASE64_FLUSH #if CS_ENABLE_STDIO #define BASE64_OUT(ch) \ @@ -127,14 +121,11 @@ void cs_base64_encode(const unsigned char *src, int src_len, char *dst) { j++; \ } while (0) -#define BASE64_FLUSH() - void cs_fprint_base64(FILE *f, const unsigned char *src, int src_len) { BASE64_ENCODE_BODY; } #undef BASE64_OUT -#undef BASE64_FLUSH #endif /* CS_ENABLE_STDIO */ /* Convert one byte of encoded base64 input stream to 6-bit chunk */ @@ -193,7 +184,6 @@ int cs_base64_decode(const unsigned char *s, int len, char *dst, int *dec_len) { if (d == 200) break; *dst++ = c << 6 | d; } - *dst = 0; if (dec_len != NULL) *dec_len = (dst - orig_dst); return orig_len - len; } diff --git a/src/common/cs_base64.h b/src/common/cs_base64.h index 4dd328c3..a3078fb6 100644 --- a/src/common/cs_base64.h +++ b/src/common/cs_base64.h @@ -29,7 +29,7 @@ void cs_base64_init(struct cs_base64_ctx *ctx, cs_base64_putc_t putc, void cs_base64_update(struct cs_base64_ctx *ctx, const char *str, size_t len); void cs_base64_finish(struct cs_base64_ctx *ctx); -void cs_base64_encode(const unsigned char *src, int src_len, char *dst); +void cs_base64_encode(const unsigned char *src, int src_len, char *dst, int *enc_len); void cs_fprint_base64(FILE *f, const unsigned char *src, int src_len); /* diff --git a/src/mg_util.c b/src/mg_util.c index 61033cf3..ed43887a 100644 --- a/src/mg_util.c +++ b/src/mg_util.c @@ -60,11 +60,16 @@ size_t mg_fwrite(const void *ptr, size_t size, size_t count, FILE *f) { #endif void mg_base64_encode(const unsigned char *src, int src_len, char *dst) { - cs_base64_encode(src, src_len, dst); + int enc_len = 0; + cs_base64_encode(src, src_len, dst, &enc_len); + dst[enc_len] = '\0'; } int mg_base64_decode(const unsigned char *s, int len, char *dst) { - return cs_base64_decode(s, len, dst, NULL); + int dec_len = 0; + int res = cs_base64_decode(s, len, dst, &dec_len); + dst[dec_len] = '\0'; + return res; } #if MG_ENABLE_THREADS