aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortobtoht <tob@featherwallet.org>2026-03-01 11:28:46 +0000
committertobtoht <tob@featherwallet.org>2026-03-01 11:28:46 +0000
commit23b420a992417abb6131b3d152d7e32adf224351 (patch)
tree67c06379d557f7525da4d91c299450f7568611f9
parent761654b880f3933fb3c390265a441a5cc83797aa (diff)
parent1e6a55109f4434b166a35a26123d7a4370a507b7 (diff)
downloadmonzero-core-23b420a992417abb6131b3d152d7e32adf224351.tar.gz
monzero-core-23b420a992417abb6131b3d152d7e32adf224351.tar.xz
monzero-core-23b420a992417abb6131b3d152d7e32adf224351.zip
Merge pull request #10337
1e6a551 cryptonote_basic: fix add_extra_nonce_to_tx_extra() length (jeffro256)
-rw-r--r--src/common/varint.h10
-rw-r--r--src/cryptonote_basic/cryptonote_format_utils.cpp12
2 files changed, 18 insertions, 4 deletions
diff --git a/src/common/varint.h b/src/common/varint.h
index 9f8b9a4ab..d544e198a 100644
--- a/src/common/varint.h
+++ b/src/common/varint.h
@@ -125,4 +125,14 @@ namespace tools {
int read_varint(InputIt &&first, InputIt &&last, T &i) {
return read_varint<std::numeric_limits<T>::digits>(std::forward<InputIt>(first), std::forward<InputIt>(last), i);
}
+
+ template <typename T, typename = std::enable_if_t<std::is_integral<T>::value && std::is_unsigned<T>::value>>
+ constexpr std::size_t get_varint_byte_size(T val) {
+ std::size_t bytes = 0;
+ do {
+ ++bytes;
+ val >>= 7;
+ } while (val);
+ return bytes;
+ }
}
diff --git a/src/cryptonote_basic/cryptonote_format_utils.cpp b/src/cryptonote_basic/cryptonote_format_utils.cpp
index ea1508505..a6d7762ff 100644
--- a/src/cryptonote_basic/cryptonote_format_utils.cpp
+++ b/src/cryptonote_basic/cryptonote_format_utils.cpp
@@ -741,15 +741,19 @@ namespace cryptonote
{
CHECK_AND_ASSERT_MES(extra_nonce.size() <= TX_EXTRA_NONCE_MAX_COUNT, false, "extra nonce could be 255 bytes max");
size_t start_pos = tx_extra.size();
- tx_extra.resize(tx_extra.size() + 2 + extra_nonce.size());
+ const std::size_t len_varint_bytes = tools::get_varint_byte_size(extra_nonce.size());
+ tx_extra.resize(tx_extra.size() + 1 + len_varint_bytes + extra_nonce.size());
//write tag
tx_extra[start_pos] = TX_EXTRA_NONCE;
//write len
++start_pos;
- tx_extra[start_pos] = static_cast<uint8_t>(extra_nonce.size());
+ unsigned char * vp = tx_extra.data() + start_pos;
+ tools::write_varint(vp, extra_nonce.size());
+ assert(vp == tx_extra.data() + tx_extra.size() - extra_nonce.size());
//write data
- ++start_pos;
- memcpy(&tx_extra[start_pos], extra_nonce.data(), extra_nonce.size());
+ start_pos += len_varint_bytes;
+ if (!extra_nonce.empty())
+ memcpy(&tx_extra[start_pos], extra_nonce.data(), extra_nonce.size());
return true;
}
//---------------------------------------------------------------