diff --git a/src/encode/base64.c b/src/encode/base64.c index c185f79c42ae23b709518a3b5d53fd218acab44f..a99bc0e306144d9b81c22bb260ad9991af4668e1 100644 --- a/src/encode/base64.c +++ b/src/encode/base64.c @@ -110,7 +110,7 @@ int b64_encode(char *target, size_t tlen, const char *source, size_t slen) { slen=strlen(source); inp=source; if(source==target) { - tmpbuf=(char *)malloc(tlen); + tmpbuf=(char *)alloca(tlen); if(tmpbuf==NULL) return(-1); outp=tmpbuf; @@ -124,43 +124,29 @@ int b64_encode(char *target, size_t tlen, const char *source, size_t slen) { enc=*(inp++); buf=(enc & 0x03)<<4; enc=(enc&0xFC)>>2; - if(add_char(outp++, enc, done, outend)) { - if(target==source) - free(tmpbuf); + if(add_char(outp++, enc, done, outend)) return(-1); - } enc=buf|((*inp & 0xF0) >> 4); - if(add_char(outp++, enc, done, outend)) { - if(target==source) - free(tmpbuf); + if(add_char(outp++, enc, done, outend)) return(-1); - } if(inp==inend) done=1; buf=(*(inp++)<<2)&0x3C; enc=buf|((*inp & 0xC0)>>6); - if(add_char(outp++, enc, done, outend)) { - if(target==source) - free(tmpbuf); + if(add_char(outp++, enc, done, outend)) return(-1); - } if(inp==inend) done=1; enc=((int)*(inp++))&0x3F; - if(add_char(outp++, enc, done, outend)) { - if(target==source) - free(tmpbuf); + if(add_char(outp++, enc, done, outend)) return(-1); - } if(inp==inend) done=1; } if(outp<outend) *outp=0; - if(target==source) { + if(target==source) memcpy(target,tmpbuf,tlen); - free(tmpbuf); - } return(outp-target); }