~petersanchez/st

ee5cc8e903574bf629e5159334ae6b0fad6af402 — Suraj N. Kurapati 6 years ago 274d46a
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.
1 files changed, 12 insertions(+), 5 deletions(-)

M st.c
M st.c => st.c +12 -5
@@ 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)