Skip to content

Commit 98939ce

Browse files
committed
Merge bitcoin/bitcoin#31655: refactor: Avoid UB in SHA3_256::Write
fabeca3 refactor: Avoid UB in SHA3_256::Write (MarcoFalke) fad4032 refactor: Drop unused UCharCast (MarcoFalke) Pull request description: It is UB to apply a distance to a pointer or iterator further than the end itself, even if the distance is (partially) revoked later on. Fix the issue by advancing the data pointer at most to the end. This fix is required to adopt C++ safe buffers bitcoin/bitcoin#31272. Also included is a somewhat unrelated commit. ACKs for top commit: sipa: utACK fabeca3 theuni: utACK fabeca3 hebasto: ACK fabeca3. Tree-SHA512: 78c53691322b72c3ba9c25ec94eec275dbbbc3049b0ad45e7d9fb2df0afbbaa905b0d8fa7106a3582f937bb1dc15a7592c4ad2d80fe4cff1062a3acfd3638f08
2 parents 712cab3 + fabeca3 commit 98939ce

File tree

5 files changed

+11
-11
lines changed

5 files changed

+11
-11
lines changed

src/crypto/chacha20.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ void ChaCha20Aligned::Seek(Nonce96 nonce, uint32_t block_counter) noexcept
5959

6060
inline void ChaCha20Aligned::Keystream(Span<std::byte> output) noexcept
6161
{
62-
unsigned char* c = UCharCast(output.data());
62+
std::byte* c = output.data();
6363
size_t blocks = output.size() / BLOCKLEN;
6464
assert(blocks * BLOCKLEN == output.size());
6565

@@ -161,8 +161,8 @@ inline void ChaCha20Aligned::Keystream(Span<std::byte> output) noexcept
161161
inline void ChaCha20Aligned::Crypt(Span<const std::byte> in_bytes, Span<std::byte> out_bytes) noexcept
162162
{
163163
assert(in_bytes.size() == out_bytes.size());
164-
const unsigned char* m = UCharCast(in_bytes.data());
165-
unsigned char* c = UCharCast(out_bytes.data());
164+
const std::byte* m = in_bytes.data();
165+
std::byte* c = out_bytes.data();
166166
size_t blocks = out_bytes.size() / BLOCKLEN;
167167
assert(blocks * BLOCKLEN == out_bytes.size());
168168

src/crypto/chacha20poly1305.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ void ComputeTag(ChaCha20& chacha20, Span<const std::byte> aad, Span<const std::b
5656
poly1305.Update(cipher).Update(Span{PADDING}.first(cipher_padding_length));
5757
// - Process the AAD and plaintext length with Poly1305.
5858
std::byte length_desc[Poly1305::TAGLEN];
59-
WriteLE64(UCharCast(length_desc), aad.size());
60-
WriteLE64(UCharCast(length_desc + 8), cipher.size());
59+
WriteLE64(length_desc, aad.size());
60+
WriteLE64(length_desc + 8, cipher.size());
6161
poly1305.Update(length_desc);
6262

6363
// Output tag.

src/crypto/sha3.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,9 @@ void KeccakF(uint64_t (&st)[25])
105105

106106
SHA3_256& SHA3_256::Write(Span<const unsigned char> data)
107107
{
108-
if (m_bufsize && m_bufsize + data.size() >= sizeof(m_buffer)) {
108+
if (m_bufsize && data.size() >= sizeof(m_buffer) - m_bufsize) {
109109
// Fill the buffer and process it.
110-
std::copy(data.begin(), data.begin() + sizeof(m_buffer) - m_bufsize, m_buffer + m_bufsize);
110+
std::copy(data.begin(), data.begin() + (sizeof(m_buffer) - m_bufsize), m_buffer + m_bufsize);
111111
data = data.subspan(sizeof(m_buffer) - m_bufsize);
112112
m_state[m_pos++] ^= ReadLE64(m_buffer);
113113
m_bufsize = 0;

src/random.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -268,12 +268,12 @@ class RandomMixin
268268
{
269269
while (span.size() >= 8) {
270270
uint64_t gen = Impl().rand64();
271-
WriteLE64(UCharCast(span.data()), gen);
271+
WriteLE64(span.data(), gen);
272272
span = span.subspan(8);
273273
}
274274
if (span.size() >= 4) {
275275
uint32_t gen = Impl().rand32();
276-
WriteLE32(UCharCast(span.data()), gen);
276+
WriteLE32(span.data(), gen);
277277
span = span.subspan(4);
278278
}
279279
while (span.size()) {
@@ -397,7 +397,7 @@ class FastRandomContext : public RandomMixin<FastRandomContext>
397397
if (requires_seed) RandomSeed();
398398
std::array<std::byte, 8> buf;
399399
rng.Keystream(buf);
400-
return ReadLE64(UCharCast(buf.data()));
400+
return ReadLE64(buf.data());
401401
}
402402

403403
/** Fill a byte Span with random bytes. This overrides the RandomMixin version. */

src/wallet/migrate.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -603,7 +603,7 @@ void BerkeleyRODatabase::Open()
603603

604604
// Read subdatabase page number
605605
// It is written as a big endian 32 bit number
606-
uint32_t main_db_page = ReadBE32(UCharCast(std::get<DataRecord>(page.records.at(1)).data.data()));
606+
uint32_t main_db_page = ReadBE32(std::get<DataRecord>(page.records.at(1)).data.data());
607607

608608
// The main database is in a page that doesn't exist
609609
if (main_db_page > outer_meta.last_page) {

0 commit comments

Comments
 (0)