diff --git a/src/encode/base64.c b/src/encode/base64.c index 65e4c088d3fbcc884f4e5252b4dabbdc38da4b37..8c2217ae77925ec9513ecf4dc6def75ac6e96706 100644 --- a/src/encode/base64.c +++ b/src/encode/base64.c @@ -131,22 +131,29 @@ int b64_encode(char *target, size_t tlen, const char *source, size_t slen) { FREE_AND_NULL(tmpbuf); return(-1); } - enc=buf|((*inp & 0xF0) >> 4); + if(inp==inend) + done=1; + if (!done) + enc=buf|((*inp & 0xF0) >> 4); if(add_char(outp++, enc, done, outend)) { FREE_AND_NULL(tmpbuf); return(-1); } - if(inp==inend) - done=1; - buf=(*(inp++)<<2)&0x3C; - enc=buf|((*inp & 0xC0)>>6); + if (!done) { + buf=(*(inp++)<<2)&0x3C; + if (inp == inend) + enc=buf; + else + enc=buf|((*inp & 0xC0)>>6); + } if(add_char(outp++, enc, done, outend)) { FREE_AND_NULL(tmpbuf); return(-1); } if(inp==inend) done=1; - enc=((int)*(inp++))&0x3F; + if (!done) + enc=((int)*(inp++))&0x3F; if(add_char(outp++, enc, done, outend)) { FREE_AND_NULL(tmpbuf); return(-1);