tbase64dec: skip non-printable characters like \r\n - st - [fork] customized bu… | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit ee5cc8e903574bf629e5159334ae6b0fad6af402 | |
parent 274d46ace00003d1df718b974d17642cbce167d5 | |
Author: Suraj N. Kurapati <[email protected]> | |
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: | |
M st.c | 17 ++++++++++++----- | |
1 file changed, 12 insertions(+), 5 deletions(-) | |
--- | |
diff --git a/st.c b/st.c | |
t@@ -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) | |
{ | |
t@@ -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) |