diff options
author | Glenn Strauss <gstrauss@gluelogic.com> | 2021-05-04 13:12:16 -0400 |
---|---|---|
committer | Glenn Strauss <gstrauss@gluelogic.com> | 2021-05-06 17:35:00 -0400 |
commit | 5e39c81ff2b0be9e28750f9a3b3f3bca59e15a9b (patch) | |
tree | e27cc5eddc59222c3a1993651a7c8acf17f4d730 /src/base64.c | |
parent | 099dc83fbe9b2e11787f247ec84f8a550149ca9c (diff) | |
download | lighttpd-git-5e39c81ff2b0be9e28750f9a3b3f3bca59e15a9b.tar.gz |
[core] li_base64_decode mark cold code path
Diffstat (limited to 'src/base64.c')
-rw-r--r-- | src/base64.c | 28 |
1 files changed, 13 insertions, 15 deletions
diff --git a/src/base64.c b/src/base64.c index d79a9da2..bbc6f85f 100644 --- a/src/base64.c +++ b/src/base64.c @@ -56,21 +56,19 @@ static size_t li_base64_decode(unsigned char * const result, const size_t out_le /* run through the whole string, converting as we go */ for (i = 0; i < in_length; i++) { - unsigned char c = (unsigned char) in[i]; - int ch; - - if (c == '\0') break; - if (c >= 128) return 0; /* only 7-bit characters allowed */ - - ch = base64_reverse_table[c]; - if (-3 == ch) { - /* pad character; can only come after 2 base64 digits in a group */ - if (group < 2) return 0; - break; - } else if (-2 == ch) { - continue; /* skip character */ - } else if (ch < 0) { - return 0; /* invalid character, abort */ + const int c = ((unsigned char *)in)[i]; + const int ch = (c < 128) ? base64_reverse_table[c] : -1; + if (__builtin_expect( (ch < 0), 0)) { + if (-3 == ch) { + /* pad character; can only come after 2 base64 digits in a group */ + if (group < 2) return 0; + break; + } else if (-2 == ch) { + continue; /* skip character */ + } else { + if (c == '\0') break; + return 0; /* invalid character, abort */ + } } switch(group) { |