From ba42390a5629c408c2e39fedcea3019767644ee5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9B=D0=B5=D0=BE=D0=BD=D0=B8=D0=B4=20=D0=AE=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=20=28Leonid=20Yuriev=29?= Date: Tue, 4 Jun 2024 10:53:56 +0300 Subject: [PATCH] =?UTF-8?q?mdbx++:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20`append=5Fu8()`=20(backport).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавленные после предыдущего выпуска append-функции оказались ошибочны. Алгоритмически там серия однотипных банальных ошибок (почти опечаток), из-за которых добавляемые данные записывались в начало среза/slice, а не в конец. Исходные ошибки были выявлены тестами в другом проекте и исправлены почти сразу, но плохой код всё-таки попал в stable-ветку. Предположительно я спутал ветки и/или tmux-окна, и взял в stable-ветку не исправленный коммит. Удивительно, что плохой код в devel-ветке не нарушил работу части новых тестов. Поэтому проблема некоторое время оставалась не замеченной. --- mdbx.h++ | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/mdbx.h++ b/mdbx.h++ index b252b39a..c1f3e2df 100644 --- a/mdbx.h++ +++ b/mdbx.h++ @@ -2749,7 +2749,7 @@ public: buffer &append(const void *src, size_t bytes) { if (MDBX_UNLIKELY(tailroom() < check_length(bytes))) MDBX_CXX20_UNLIKELY reserve_tailroom(bytes); - memcpy(slice_.byte_ptr() + size(), src, bytes); + memcpy(end_byte_ptr(), src, bytes); slice_.iov_len += bytes; return *this; } @@ -2818,7 +2818,7 @@ public: buffer &append_u8(uint_fast8_t u8) { if (MDBX_UNLIKELY(tailroom() < 1)) MDBX_CXX20_UNLIKELY reserve_tailroom(1); - *slice_.byte_ptr() = u8; + *slice_.end_byte_ptr() = uint8_t(u8); slice_.iov_len += 1; return *this; } @@ -2828,7 +2828,7 @@ public: buffer &append_u16(uint_fast16_t u16) { if (MDBX_UNLIKELY(tailroom() < 2)) MDBX_CXX20_UNLIKELY reserve_tailroom(2); - const auto ptr = slice_.byte_ptr(); + const auto ptr = slice_.end_byte_ptr(); ptr[0] = uint8_t(u16); ptr[1] = uint8_t(u16 >> 8); slice_.iov_len += 2; @@ -2838,7 +2838,7 @@ public: buffer &append_u24(uint_fast32_t u24) { if (MDBX_UNLIKELY(tailroom() < 3)) MDBX_CXX20_UNLIKELY reserve_tailroom(3); - const auto ptr = slice_.byte_ptr(); + const auto ptr = slice_.end_byte_ptr(); ptr[0] = uint8_t(u24); ptr[1] = uint8_t(u24 >> 8); ptr[2] = uint8_t(u24 >> 16); @@ -2849,7 +2849,7 @@ public: buffer &append_u32(uint_fast32_t u32) { if (MDBX_UNLIKELY(tailroom() < 4)) MDBX_CXX20_UNLIKELY reserve_tailroom(4); - const auto ptr = slice_.byte_ptr(); + const auto ptr = slice_.end_byte_ptr(); ptr[0] = uint8_t(u32); ptr[1] = uint8_t(u32 >> 8); ptr[2] = uint8_t(u32 >> 16); @@ -2861,7 +2861,7 @@ public: buffer &append_u48(uint_fast64_t u48) { if (MDBX_UNLIKELY(tailroom() < 6)) MDBX_CXX20_UNLIKELY reserve_tailroom(6); - const auto ptr = slice_.byte_ptr(); + const auto ptr = slice_.end_byte_ptr(); ptr[0] = uint8_t(u48); ptr[1] = uint8_t(u48 >> 8); ptr[2] = uint8_t(u48 >> 16); @@ -2875,7 +2875,7 @@ public: buffer &append_u64(uint_fast64_t u64) { if (MDBX_UNLIKELY(tailroom() < 8)) MDBX_CXX20_UNLIKELY reserve_tailroom(8); - const auto ptr = slice_.byte_ptr(); + const auto ptr = slice_.end_byte_ptr(); ptr[0] = uint8_t(u64); ptr[1] = uint8_t(u64 >> 8); ptr[2] = uint8_t(u64 >> 16);