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"; + }