st

fork of suckless's simple terminal
Index Commits Files Refs README LICENSE
commit ee5cc8e903574bf629e5159334ae6b0fad6af402
parent 274d46ace00003d1df718b974d17642cbce167d5
Author: Suraj N. Kurapati <sunaku@riseup.net>
Date:   Thu, 17 Aug 2017 23:00:10 -0700

base64dec: skip non-printable characters like \r\n

Non-printable characters, such as line breaks, in a base64 encoded
string violate the "string length must be a multiple of four" rule.

This patch pads the result buffer by one extra unit of four bytes,
and skips over non-printable characters found in the input string.

Diffstat:
Mst.c | 17++++++++++++-----
1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/st.c b/st.c
@@ -386,6 +386,13 @@ static const char base64_digits[] = {
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
 };
 
+char
+base64dec_getc(const char **src)
+{
+    while (**src && !isprint(**src)) (*src)++;
+    return *((*src)++);
+}
+
 char *
 base64dec(const char *src)
 {
@@ -393,13 +400,13 @@ base64dec(const char *src)
     char *result, *dst;
 
     if (in_len % 4)
-        return NULL;
+        in_len += 4 - (in_len % 4);
     result = dst = xmalloc(in_len / 4 * 3 + 1);
     while (*src) {
-        int a = base64_digits[(unsigned char) *src++];
-        int b = base64_digits[(unsigned char) *src++];
-        int c = base64_digits[(unsigned char) *src++];
-        int d = base64_digits[(unsigned char) *src++];
+        int a = base64_digits[(unsigned char) base64dec_getc(&src)];
+        int b = base64_digits[(unsigned char) base64dec_getc(&src)];
+        int c = base64_digits[(unsigned char) base64dec_getc(&src)];
+        int d = base64_digits[(unsigned char) base64dec_getc(&src)];
 
         *dst++ = (a << 2) | ((b & 0x30) >> 4);
         if (c == -1)