mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-01-31 10:41:08 +00:00
Merge bitcoin/bitcoin#33853: kernel: Allow null arguments for serialized data
a3ac59a4316305fb38a5338b48940682889d0dc2 ci: Enable experimental kernel stuff in ASan task (MarcoFalke) 5b89956eeb76cf8c9717152fbb0928e026fc0087 kernel: Allow null arguments for serialized data (TheCharlatan) Pull request description: An empty span constructed from an empty vector may have a null data pointer depending on the implementation. Remove the BITCOINKERNEL_ARG_NONNULL requirement for these arguments and instead handle such null arguments in the implementation. Also cherry-picked from #33845 to show that CI task passing now. ACKs for top commit: yuvicc: Code review ACK a3ac59a4316305fb38a5338b48940682889d0dc2 maflcko: review ACK a3ac59a4316305fb38a5338b48940682889d0dc2 🥈 laanwj: code review ACK a3ac59a4316305fb38a5338b48940682889d0dc2 Tree-SHA512: 629e463796f2f057df5be8e8981a45751c578ed0021be731c1d57fe849a539fe38b0a445914b0fc48f32f0408ad6d566984bd7f3a68797fcfdf1c6889e316a08
This commit is contained in:
commit
47618446a0
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
@ -468,7 +468,7 @@ jobs:
|
||||
file-env: './ci/test/00_setup_env_arm.sh'
|
||||
provider: 'gha'
|
||||
|
||||
- name: 'ASan + LSan + UBSan + integer, no depends, USDT'
|
||||
- name: 'ASan + LSan + UBSan + integer'
|
||||
cirrus-runner: 'ghcr.io/cirruslabs/ubuntu-runner-amd64:24.04-md' # has to match container in ci/test/00_setup_env_native_asan.sh for tracing tools
|
||||
fallback-runner: 'ubuntu-24.04'
|
||||
timeout-minutes: 120
|
||||
|
||||
@ -26,7 +26,7 @@ export NO_DEPENDS=1
|
||||
export GOAL="install"
|
||||
export CI_LIMIT_STACK_SIZE=1
|
||||
export BITCOIN_CONFIG="\
|
||||
-DWITH_USDT=ON -DWITH_ZMQ=ON -DBUILD_GUI=ON \
|
||||
--preset=dev-mode \
|
||||
-DSANITIZERS=address,float-divide-by-zero,integer,undefined \
|
||||
-DCMAKE_C_COMPILER=clang \
|
||||
-DCMAKE_CXX_COMPILER=clang++ \
|
||||
|
||||
@ -497,6 +497,9 @@ struct btck_Txid: Handle<btck_Txid, Txid> {};
|
||||
|
||||
btck_Transaction* btck_transaction_create(const void* raw_transaction, size_t raw_transaction_len)
|
||||
{
|
||||
if (raw_transaction == nullptr && raw_transaction_len != 0) {
|
||||
return nullptr;
|
||||
}
|
||||
try {
|
||||
DataStream stream{std::span{reinterpret_cast<const std::byte*>(raw_transaction), raw_transaction_len}};
|
||||
return btck_Transaction::create(std::make_shared<const CTransaction>(deserialize, TX_WITH_WITNESS, stream));
|
||||
@ -556,6 +559,9 @@ void btck_transaction_destroy(btck_Transaction* transaction)
|
||||
|
||||
btck_ScriptPubkey* btck_script_pubkey_create(const void* script_pubkey, size_t script_pubkey_len)
|
||||
{
|
||||
if (script_pubkey == nullptr && script_pubkey_len != 0) {
|
||||
return nullptr;
|
||||
}
|
||||
auto data = std::span{reinterpret_cast<const uint8_t*>(script_pubkey), script_pubkey_len};
|
||||
return btck_ScriptPubkey::create(data.begin(), data.end());
|
||||
}
|
||||
@ -1033,6 +1039,9 @@ int btck_chainstate_manager_import_blocks(btck_ChainstateManager* chainman, cons
|
||||
|
||||
btck_Block* btck_block_create(const void* raw_block, size_t raw_block_length)
|
||||
{
|
||||
if (raw_block == nullptr && raw_block_length != 0) {
|
||||
return nullptr;
|
||||
}
|
||||
auto block{std::make_shared<CBlock>()};
|
||||
|
||||
DataStream stream{std::span{reinterpret_cast<const std::byte*>(raw_block), raw_block_length}};
|
||||
|
||||
@ -469,12 +469,12 @@ typedef uint8_t btck_ChainType;
|
||||
/**
|
||||
* @brief Create a new transaction from the serialized data.
|
||||
*
|
||||
* @param[in] raw_transaction Non-null.
|
||||
* @param[in] raw_transaction Serialized transaction.
|
||||
* @param[in] raw_transaction_len Length of the serialized transaction.
|
||||
* @return The transaction, or null on error.
|
||||
*/
|
||||
BITCOINKERNEL_API btck_Transaction* BITCOINKERNEL_WARN_UNUSED_RESULT btck_transaction_create(
|
||||
const void* raw_transaction, size_t raw_transaction_len) BITCOINKERNEL_ARG_NONNULL(1);
|
||||
const void* raw_transaction, size_t raw_transaction_len);
|
||||
|
||||
/**
|
||||
* @brief Copy a transaction. Transactions are reference counted, so this just
|
||||
@ -567,12 +567,12 @@ BITCOINKERNEL_API void btck_transaction_destroy(btck_Transaction* transaction);
|
||||
|
||||
/**
|
||||
* @brief Create a script pubkey from serialized data.
|
||||
* @param[in] script_pubkey Non-null.
|
||||
* @param[in] script_pubkey Serialized script pubkey.
|
||||
* @param[in] script_pubkey_len Length of the script pubkey data.
|
||||
* @return The script pubkey.
|
||||
*/
|
||||
BITCOINKERNEL_API btck_ScriptPubkey* BITCOINKERNEL_WARN_UNUSED_RESULT btck_script_pubkey_create(
|
||||
const void* script_pubkey, size_t script_pubkey_len) BITCOINKERNEL_ARG_NONNULL(1);
|
||||
const void* script_pubkey, size_t script_pubkey_len);
|
||||
|
||||
/**
|
||||
* @brief Copy a script pubkey.
|
||||
@ -1111,12 +1111,12 @@ BITCOINKERNEL_API btck_Block* BITCOINKERNEL_WARN_UNUSED_RESULT btck_block_read(
|
||||
/**
|
||||
* @brief Parse a serialized raw block into a new block object.
|
||||
*
|
||||
* @param[in] raw_block Non-null, serialized block.
|
||||
* @param[in] raw_block Serialized block.
|
||||
* @param[in] raw_block_len Length of the serialized block.
|
||||
* @return The allocated block, or null on error.
|
||||
*/
|
||||
BITCOINKERNEL_API btck_Block* BITCOINKERNEL_WARN_UNUSED_RESULT btck_block_create(
|
||||
const void* raw_block, size_t raw_block_len) BITCOINKERNEL_ARG_NONNULL(1);
|
||||
const void* raw_block, size_t raw_block_len);
|
||||
|
||||
/**
|
||||
* @brief Copy a block. Blocks are reference counted, so this just increments
|
||||
|
||||
@ -14,7 +14,6 @@
|
||||
#include <cstdint>
|
||||
#include <cstdlib>
|
||||
#include <filesystem>
|
||||
#include <format>
|
||||
#include <iostream>
|
||||
#include <memory>
|
||||
#include <optional>
|
||||
@ -395,6 +394,12 @@ BOOST_AUTO_TEST_CASE(btck_transaction_tests)
|
||||
auto tx2{Transaction{tx_data_2}};
|
||||
CheckHandle(tx, tx2);
|
||||
|
||||
auto invalid_data = hex_string_to_byte_vec("012300");
|
||||
BOOST_CHECK_THROW(Transaction{invalid_data}, std::runtime_error);
|
||||
auto empty_data = hex_string_to_byte_vec("");
|
||||
BOOST_CHECK_THROW(Transaction{empty_data}, std::runtime_error);
|
||||
BOOST_CHECK_THROW(Transaction{std::span<std::byte>(static_cast<std::byte*>(nullptr), 2)}, std::runtime_error);
|
||||
|
||||
BOOST_CHECK_EQUAL(tx.CountOutputs(), 2);
|
||||
BOOST_CHECK_EQUAL(tx.CountInputs(), 1);
|
||||
auto broken_tx_data{std::span<std::byte>{tx_data.begin(), tx_data.begin() + 10}};
|
||||
@ -469,6 +474,8 @@ BOOST_AUTO_TEST_CASE(btck_script_pubkey)
|
||||
ScriptPubkey script{script_data};
|
||||
ScriptPubkey script2{script_data_2};
|
||||
CheckHandle(script, script2);
|
||||
|
||||
BOOST_CHECK_THROW(ScriptPubkey{std::span<std::byte>(static_cast<std::byte*>(nullptr), 2)}, std::runtime_error);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(btck_transaction_output)
|
||||
@ -581,6 +588,11 @@ BOOST_AUTO_TEST_CASE(btck_block)
|
||||
CheckHandle(block, block_100);
|
||||
Block block_tx{hex_string_to_byte_vec(REGTEST_BLOCK_DATA[205])};
|
||||
CheckRange(block_tx.Transactions(), block_tx.CountTransactions());
|
||||
auto invalid_data = hex_string_to_byte_vec("012300");
|
||||
BOOST_CHECK_THROW(Block{invalid_data}, std::runtime_error);
|
||||
auto empty_data = hex_string_to_byte_vec("");
|
||||
BOOST_CHECK_THROW(Block{empty_data}, std::runtime_error);
|
||||
BOOST_CHECK_THROW(Block{std::span<std::byte>(static_cast<std::byte*>(nullptr), 2)}, std::runtime_error);
|
||||
}
|
||||
|
||||
Context create_context(std::shared_ptr<TestKernelNotifications> notifications, ChainType chain_type, std::shared_ptr<TestValidationInterface> validation_interface = nullptr)
|
||||
@ -713,17 +725,6 @@ void chainman_mainnet_validation_test(TestDirectory& test_directory)
|
||||
auto context{create_context(notifications, ChainType::MAINNET, validation_interface)};
|
||||
auto chainman{create_chainman(test_directory, false, false, false, false, context)};
|
||||
|
||||
{
|
||||
// Process an invalid block
|
||||
auto raw_block = hex_string_to_byte_vec("012300");
|
||||
BOOST_CHECK_THROW(Block{raw_block}, std::runtime_error);
|
||||
}
|
||||
{
|
||||
// Process an empty block
|
||||
auto raw_block = hex_string_to_byte_vec("");
|
||||
BOOST_CHECK_THROW(Block{raw_block}, std::runtime_error);
|
||||
}
|
||||
|
||||
// mainnet block 1
|
||||
auto raw_block = hex_string_to_byte_vec("010000006fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000982051fd1e4ba744bbbe680e1fee14677ba1a3c3540bf7b1cdb606e857233e0e61bc6649ffff001d01e362990101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0704ffff001d0104ffffffff0100f2052a0100000043410496b538e853519c726a2c91e61ec11600ae1390813a627c66fb8be7947be63c52da7589379515d4e0a604f8141781e62294721166bf621e73a82cbf2342c858eeac00000000");
|
||||
Block block{raw_block};
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user