From: Wilfried Goesgens Date: Mon, 6 Jan 2014 23:38:27 +0000 (+0100) Subject: BASE64: add stream handler for base 64 decoding - make shure its not called for to... X-Git-Tag: v9.01~149 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=e2c97f4b0f5420b21f491d6e61dca580f8772d39 BASE64: add stream handler for base 64 decoding - make shure its not called for to small chunks - else it will eat cpu. --- diff --git a/libcitadel/lib/libcitadel.h b/libcitadel/lib/libcitadel.h index a1aacb5fb..7dd18e64c 100644 --- a/libcitadel/lib/libcitadel.h +++ b/libcitadel/lib/libcitadel.h @@ -338,6 +338,14 @@ void StrBuf_RFC822_2_Utf8(StrBuf *Target, /* deprecated old version: */ void StrBuf_RFC822_to_Utf8(StrBuf *Target, const StrBuf *DecodeMe, const StrBuf* DefaultCharset, StrBuf *FoundCharset); +typedef enum __eStreamType { + eBase64Decode +} eStreamType; + +void *StrBufNewStreamContext(eStreamType type); +void StrBufDestroyStreamContext(eStreamType type, void **Stream); +void StrBufStreamDecodeTo(StrBuf *Target, const StrBuf *In, const char* pIn, long pInLen, void *Stream); + int StrBufDecodeBase64(StrBuf *Buf); int StrBufDecodeBase64To(const StrBuf *BufIn, StrBuf *BufOut); int StrBufDecodeHex(StrBuf *Buf); diff --git a/libcitadel/lib/stringbuf.c b/libcitadel/lib/stringbuf.c index 547037751..5e89ea2f1 100644 --- a/libcitadel/lib/stringbuf.c +++ b/libcitadel/lib/stringbuf.c @@ -32,6 +32,9 @@ #include "libcitadel.h" +#include "b64/cencode.h" +#include "b64/cdecode.h" + #ifdef HAVE_ICONV #include #endif @@ -2843,6 +2846,56 @@ int StrBufDecodeBase64To(const StrBuf *BufIn, StrBuf *BufOut) return BufOut->BufUsed; } +void *StrBufNewStreamContext(eStreamType type) +{ + base64_decodestate *state;; + + switch (type) + { + case eBase64Decode: + state = (base64_decodestate*) malloc(sizeof(base64_decodestate)); + base64_init_decodestate(state); + return state; + break; + } + return NULL; +} + +void StrBufDestroyStreamContext(eStreamType type, void **Stream) +{ + switch (type) + { + case eBase64Decode: + free(*Stream); + *Stream = NULL; + break; + } +} +void StrBufStreamDecodeTo(StrBuf *Target, const StrBuf *In, const char* pIn, long pInLen, void *Stream) +{ + base64_decodestate *state = Stream; + long ExpectLen; + + if (In != NULL) + { + pIn = In->buf; + pInLen = In->BufUsed; + } + if ((pIn == NULL) || (Stream == NULL)) + return; + + ExpectLen = (pInLen / 4) * 3; + + if (Target->BufSize - Target->BufUsed < ExpectLen) + { + IncreaseBuf(Target, 1, Target->BufUsed + ExpectLen + 1); + } + + ExpectLen = base64_decode_block(pIn, pInLen, Target->buf + Target->BufUsed, state); + Target->BufUsed += ExpectLen; + Target->buf[Target->BufUsed] = '\0'; +} + /** * @ingroup StrBuf_DeEnCoder * @brief decode a buffer from base 64 encoding; destroys original