Skip to content

Commit

Permalink
fuzz: bolster ExtractDestination(s) checks
Browse files Browse the repository at this point in the history
  • Loading branch information
mjdietzx committed Jan 3, 2021
1 parent 2dab2d2 commit a29f522
Showing 1 changed file with 38 additions and 10 deletions.
48 changes: 38 additions & 10 deletions src/test/fuzz/script.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,22 +56,45 @@ FUZZ_TARGET_INIT(script, initialize_script)
}

CTxDestination address;
(void)ExtractDestination(script, address);

TxoutType type_ret;
std::vector<CTxDestination> addresses;
int required_ret;
(void)ExtractDestinations(script, type_ret, addresses, required_ret);

const FlatSigningProvider signing_provider;
(void)InferDescriptor(script, signing_provider);

(void)IsSegWitOutput(signing_provider, script);

(void)IsSolvable(signing_provider, script);
bool extract_destinations_ret = ExtractDestinations(script, type_ret, addresses, required_ret);
bool extract_destination_ret = ExtractDestination(script, address);
if (!extract_destinations_ret) {
assert(!extract_destination_ret);
if (type_ret == TxoutType::MULTISIG) {
assert(addresses.empty() && required_ret == 0);
} else {
assert(type_ret == TxoutType::PUBKEY ||
type_ret == TxoutType::NONSTANDARD ||
type_ret == TxoutType::NULL_DATA);
}
} else {
assert(required_ret >= 1 && required_ret <= 16);
assert((unsigned long)required_ret == addresses.size());
assert(type_ret == TxoutType::MULTISIG || required_ret == 1);
}
if (type_ret == TxoutType::NONSTANDARD || type_ret == TxoutType::NULL_DATA) {
assert(!extract_destinations_ret);
}
if (!extract_destination_ret) {
assert(type_ret == TxoutType::PUBKEY ||
type_ret == TxoutType::NONSTANDARD ||
type_ret == TxoutType::NULL_DATA ||
type_ret == TxoutType::MULTISIG);
} else {
assert(address == addresses[0]);
}
if (type_ret == TxoutType::NONSTANDARD ||
type_ret == TxoutType::NULL_DATA ||
type_ret == TxoutType::MULTISIG) {
assert(!extract_destination_ret);
}

TxoutType which_type;
bool is_standard_ret = IsStandard(script, which_type);
assert(type_ret == which_type);
if (!is_standard_ret) {
assert(which_type == TxoutType::NONSTANDARD ||
which_type == TxoutType::NULL_DATA ||
Expand All @@ -88,6 +111,11 @@ FUZZ_TARGET_INIT(script, initialize_script)
which_type == TxoutType::NONSTANDARD);
}

const FlatSigningProvider signing_provider;
(void)InferDescriptor(script, signing_provider);
(void)IsSegWitOutput(signing_provider, script);
(void)IsSolvable(signing_provider, script);

(void)RecursiveDynamicUsage(script);

std::vector<std::vector<unsigned char>> solutions;
Expand Down

0 comments on commit a29f522

Please sign in to comment.