From 5dc54fb40ec6efa7b3955c8e6aa49c14ad3c6cc4 Mon Sep 17 00:00:00 2001 From: Arne Welzel Date: Thu, 2 Feb 2023 14:53:28 +0100 Subject: [PATCH] Base64: report byte as positive integer A baseline difference between arm64 and x86 showed up. We would print a wrong character as negative value on x86 due to chars being signed by default. Force an unsigned interpretation which is also more reasonable because we'd have never indexed the base64 table with -112 -XXXXXXXXXX.XXXXXX XXXXXXXXXXX 131.243.99.154 3288 193.159.183.138 80 base64_illegal_encoding character -112 ignored by Base64 decoding F zeek - +XXXXXXXXXX.XXXXXX XXXXXXXXXXX 131.243.99.154 3288 193.159.183.138 80 base64_illegal_encoding character 144 ignored by Base64 decoding F zeek - Fixes more of #2742 --- src/Base64.cc | 8 ++++---- testing/btest/Baseline/bifs.decode_base64_errors/out | 7 +++++++ testing/btest/bifs/decode_base64_errors.zeek | 11 +++++++++++ 3 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 testing/btest/Baseline/bifs.decode_base64_errors/out create mode 100644 testing/btest/bifs/decode_base64_errors.zeek diff --git a/src/Base64.cc b/src/Base64.cc index 1cf3f1b924..b88c7dff60 100644 --- a/src/Base64.cc +++ b/src/Base64.cc @@ -184,17 +184,17 @@ int Base64Converter::Decode(int len, const char* data, int* pblen, char** pbuf) if ( dlen >= len ) break; - if ( data[dlen] == '=' ) + unsigned char c = (unsigned char)data[dlen]; + if ( c == '=' ) ++base64_padding; - int k = base64_table[(unsigned char)data[dlen]]; + int k = base64_table[c]; if ( k >= 0 ) base64_group[base64_group_next++] = k; else { if ( ++errored == 1 ) - IllegalEncoding( - util::fmt("character %d ignored by Base64 decoding", (int)(data[dlen]))); + IllegalEncoding(util::fmt("character %d ignored by Base64 decoding", (int)c)); } ++dlen; diff --git a/testing/btest/Baseline/bifs.decode_base64_errors/out b/testing/btest/Baseline/bifs.decode_base64_errors/out new file mode 100644 index 0000000000..6fd2476e2f --- /dev/null +++ b/testing/btest/Baseline/bifs.decode_base64_errors/out @@ -0,0 +1,7 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +error: character 94 ignored by Base64 decoding +error: error in decoding string ^#@!@##$!=== +error: character 237 ignored by Base64 decoding +error: error in decoding string ноп=== +PASS +PASS diff --git a/testing/btest/bifs/decode_base64_errors.zeek b/testing/btest/bifs/decode_base64_errors.zeek new file mode 100644 index 0000000000..0becccb09b --- /dev/null +++ b/testing/btest/bifs/decode_base64_errors.zeek @@ -0,0 +1,11 @@ +# @TEST-EXEC: zeek -b %INPUT >out 2>&1 +# @TEST-EXEC: btest-diff out + +event zeek_init() + { + local r1 = decode_base64("^#@!@##$!==="); + print |r1| > 0 ? "FAIL" : "PASS"; + + local r2 = decode_base64("\xed\xee\xef==="); + print |r2| > 0 ? "FAIL" : "PASS"; + }