# st

Unnamed repository; edit this file 'description' to name the repository.

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