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);
 }