[hackers] [st] base64dec: skip non-printable characters like \r\n || Suraj N. Kurapati

From: <git_AT_suckless.org>
Date: Fri, 15 Sep 2017 11:19:47 +0200 (CEST)

commit ee5cc8e903574bf629e5159334ae6b0fad6af402
Author: Suraj N. Kurapati <sunaku_AT_riseup.net>
AuthorDate: Thu Aug 17 23:00:10 2017 -0700
Commit: Hiltjo Posthuma <hiltjo_AT_codemadness.org>
CommitDate: Fri Sep 15 11:13:17 2017 +0200

    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.

diff --git a/st.c b/st.c
index ae93ade..7c7ddff 100644
--- a/st.c
+++ b/st.c
_AT_@ -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)
 {
_AT_@ -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)
Received on Fri Sep 15 2017 - 11:19:47 CEST

This archive was generated by hypermail 2.3.0 : Fri Sep 15 2017 - 11:24:42 CEST