diff options
author | Suraj N. Kurapati <sunaku@riseup.net> | 2017-08-17 23:00:10 -0700 |
---|---|---|
committer | Hiltjo Posthuma <hiltjo@codemadness.org> | 2017-09-15 11:13:17 +0200 |
commit | ee5cc8e903574bf629e5159334ae6b0fad6af402 (patch) | |
tree | de4764f1636464d7a0db6635003c149dcf26203a | |
parent | 274d46ace00003d1df718b974d17642cbce167d5 (diff) | |
download | st-ee5cc8e903574bf629e5159334ae6b0fad6af402.tar.gz |
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.
-rw-r--r-- | st.c | 17 |
1 files changed, 12 insertions, 5 deletions
@@ -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) |