mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-01-20 23:29:12 +01:00
Change Parse descriptor argument to string_view
Commit b3bf18f0ba changed the function
signature from Parse(const std::string& descriptor,...) to
Parse(std::span<const char> descriptor,...).
Calling this new version of Parse with a string literal will trigger
a confusing "Invalid characters in payload" due to the trailing "\0".
Switch to string_view and add a test.
Co-authored-by: MarcoFalke <*~=`'#}+{/-|&$^_@721217.xyz>
This commit is contained in:
@@ -2743,12 +2743,13 @@ bool CheckChecksum(std::span<const char>& sp, bool require_checksum, std::string
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Descriptor>> Parse(std::span<const char> descriptor, FlatSigningProvider& out, std::string& error, bool require_checksum)
|
std::vector<std::unique_ptr<Descriptor>> Parse(std::string_view descriptor, FlatSigningProvider& out, std::string& error, bool require_checksum)
|
||||||
{
|
{
|
||||||
if (!CheckChecksum(descriptor, require_checksum, error)) return {};
|
std::span<const char> sp{descriptor};
|
||||||
|
if (!CheckChecksum(sp, require_checksum, error)) return {};
|
||||||
uint32_t key_exp_index = 0;
|
uint32_t key_exp_index = 0;
|
||||||
auto ret = ParseScript(key_exp_index, descriptor, ParseScriptContext::TOP, out, error);
|
auto ret = ParseScript(key_exp_index, sp, ParseScriptContext::TOP, out, error);
|
||||||
if (descriptor.empty() && !ret.empty()) {
|
if (sp.empty() && !ret.empty()) {
|
||||||
std::vector<std::unique_ptr<Descriptor>> descs;
|
std::vector<std::unique_ptr<Descriptor>> descs;
|
||||||
descs.reserve(ret.size());
|
descs.reserve(ret.size());
|
||||||
for (auto& r : ret) {
|
for (auto& r : ret) {
|
||||||
|
|||||||
@@ -175,7 +175,7 @@ struct Descriptor {
|
|||||||
* If a parse error occurs, or the checksum is missing/invalid, or anything
|
* If a parse error occurs, or the checksum is missing/invalid, or anything
|
||||||
* else is wrong, an empty vector is returned.
|
* else is wrong, an empty vector is returned.
|
||||||
*/
|
*/
|
||||||
std::vector<std::unique_ptr<Descriptor>> Parse(std::span<const char> descriptor, FlatSigningProvider& out, std::string& error, bool require_checksum = false);
|
std::vector<std::unique_ptr<Descriptor>> Parse(std::string_view descriptor, FlatSigningProvider& out, std::string& error, bool require_checksum = false);
|
||||||
|
|
||||||
/** Get the checksum for a `descriptor`.
|
/** Get the checksum for a `descriptor`.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1262,4 +1262,13 @@ BOOST_AUTO_TEST_CASE(descriptor_test)
|
|||||||
CheckUnparsable("tr(musig(tuus(oldepk(gg)ggggfgg)<,z(((((((((((((((((((((st)", "tr(musig(tuus(oldepk(gg)ggggfgg)<,z(((((((((((((((((((((st)","tr(): Too many ')' in musig() expression");
|
CheckUnparsable("tr(musig(tuus(oldepk(gg)ggggfgg)<,z(((((((((((((((((((((st)", "tr(musig(tuus(oldepk(gg)ggggfgg)<,z(((((((((((((((((((((st)","tr(): Too many ')' in musig() expression");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(descriptor_literal_null_byte)
|
||||||
|
{
|
||||||
|
// Trailing '\0' string literal should be ignored.
|
||||||
|
FlatSigningProvider keys;
|
||||||
|
std::string err;
|
||||||
|
auto descs = Parse("pk(0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798)", keys, err, /*require_checksum=*/false);
|
||||||
|
BOOST_REQUIRE_MESSAGE(!descs.empty(), err);
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE_END()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|||||||
Reference in New Issue
Block a user