Skip to content

Commit bad1433

Browse files
l0rincmaflckomarcofleonmzumsande
committed
fuzz: Always restrict base conversion input lengths
They seem to cause timeouts: > Issue 397734700: bitcoin-core:base58check_encode_decode: Timeout in base58check_encode_decode The `encoded_string.empty()` check was corrected here to `decoded.empty()` to make sure the `(0, decoded.size() - 1)` range is always valid. Co-authored-by: maflcko <[email protected]> Co-authored-by: marcofleon <[email protected]> Co-authored-by: Martin Zumsande <[email protected]>
1 parent 5b8fd7c commit bad1433

File tree

1 file changed

+17
-18
lines changed

1 file changed

+17
-18
lines changed

src/test/fuzz/base_encode_decode.cpp

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
#include <base58.h>
88
#include <psbt.h>
9+
#include <span.h>
910
#include <test/fuzz/FuzzedDataProvider.h>
1011
#include <util/strencodings.h>
1112
#include <util/string.h>
@@ -19,42 +20,40 @@ using util::TrimStringView;
1920

2021
FUZZ_TARGET(base58_encode_decode)
2122
{
22-
FuzzedDataProvider provider(buffer.data(), buffer.size());
23-
const std::string random_string{provider.ConsumeRandomLengthString(1000)};
24-
const int max_ret_len{provider.ConsumeIntegralInRange<int>(-1, 1000)};
23+
FuzzedDataProvider provider{buffer.data(), buffer.size()};
24+
const auto random_string{provider.ConsumeRandomLengthString(100)};
25+
const int max_ret_len{provider.ConsumeIntegralInRange<int>(-1, 100)};
2526

2627
// Decode/Encode roundtrip
27-
std::vector<unsigned char> decoded;
28-
if (DecodeBase58(random_string, decoded, max_ret_len)) {
28+
if (std::vector<unsigned char> decoded; DecodeBase58(random_string, decoded, max_ret_len)) {
2929
const auto encoded_string{EncodeBase58(decoded)};
3030
assert(encoded_string == TrimStringView(random_string));
31-
assert(encoded_string.empty() || !DecodeBase58(encoded_string, decoded, provider.ConsumeIntegralInRange<int>(0, decoded.size() - 1)));
31+
assert(decoded.empty() || !DecodeBase58(encoded_string, decoded, provider.ConsumeIntegralInRange<int>(0, decoded.size() - 1)));
3232
}
3333
// Encode/Decode roundtrip
34-
const auto encoded{EncodeBase58(buffer)};
34+
const auto encoded{EncodeBase58(MakeUCharSpan(random_string))};
3535
std::vector<unsigned char> roundtrip_decoded;
36-
assert(DecodeBase58(encoded, roundtrip_decoded, buffer.size())
37-
&& std::ranges::equal(roundtrip_decoded, buffer));
36+
assert(DecodeBase58(encoded, roundtrip_decoded, random_string.size())
37+
&& std::ranges::equal(roundtrip_decoded, MakeUCharSpan(random_string)));
3838
}
3939

4040
FUZZ_TARGET(base58check_encode_decode)
4141
{
42-
FuzzedDataProvider provider(buffer.data(), buffer.size());
43-
const std::string random_string{provider.ConsumeRandomLengthString(1000)};
44-
const int max_ret_len{provider.ConsumeIntegralInRange<int>(-1, 1000)};
42+
FuzzedDataProvider provider{buffer.data(), buffer.size()};
43+
const auto random_string{provider.ConsumeRandomLengthString(100)};
44+
const int max_ret_len{provider.ConsumeIntegralInRange<int>(-1, 100)};
4545

4646
// Decode/Encode roundtrip
47-
std::vector<unsigned char> decoded;
48-
if (DecodeBase58Check(random_string, decoded, max_ret_len)) {
47+
if (std::vector<unsigned char> decoded; DecodeBase58Check(random_string, decoded, max_ret_len)) {
4948
const auto encoded_string{EncodeBase58Check(decoded)};
5049
assert(encoded_string == TrimStringView(random_string));
51-
assert(encoded_string.empty() || !DecodeBase58Check(encoded_string, decoded, provider.ConsumeIntegralInRange<int>(0, decoded.size() - 1)));
50+
assert(decoded.empty() || !DecodeBase58Check(encoded_string, decoded, provider.ConsumeIntegralInRange<int>(0, decoded.size() - 1)));
5251
}
5352
// Encode/Decode roundtrip
54-
const auto encoded{EncodeBase58Check(buffer)};
53+
const auto encoded{EncodeBase58Check(MakeUCharSpan(random_string))};
5554
std::vector<unsigned char> roundtrip_decoded;
56-
assert(DecodeBase58Check(encoded, roundtrip_decoded, buffer.size())
57-
&& std::ranges::equal(roundtrip_decoded, buffer));
55+
assert(DecodeBase58Check(encoded, roundtrip_decoded, random_string.size())
56+
&& std::ranges::equal(roundtrip_decoded, MakeUCharSpan(random_string)));
5857
}
5958

6059
FUZZ_TARGET(base32_encode_decode)

0 commit comments

Comments
 (0)