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