summaryrefslogtreecommitdiff
path: root/src/base64.c
diff options
context:
space:
mode:
authorGlenn Strauss <gstrauss@gluelogic.com>2021-05-04 13:12:16 -0400
committerGlenn Strauss <gstrauss@gluelogic.com>2021-05-06 17:35:00 -0400
commit5e39c81ff2b0be9e28750f9a3b3f3bca59e15a9b (patch)
treee27cc5eddc59222c3a1993651a7c8acf17f4d730 /src/base64.c
parent099dc83fbe9b2e11787f247ec84f8a550149ca9c (diff)
downloadlighttpd-git-5e39c81ff2b0be9e28750f9a3b3f3bca59e15a9b.tar.gz
[core] li_base64_decode mark cold code path
Diffstat (limited to 'src/base64.c')
-rw-r--r--src/base64.c28
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) {