diff options
| -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)  | 
