From 38af8ac849d63e88ea5d862444e94165e9fb8218 Mon Sep 17 00:00:00 2001 From: Peter van Dijk Date: Fri, 17 Mar 2023 11:57:26 +0100 Subject: [PATCH] avoid one unaligned uint16_t access --- ext/lmdb-safe/lmdb-safe.cc | 4 +++- ext/lmdb-safe/lmdb-safe.hh | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/ext/lmdb-safe/lmdb-safe.cc b/ext/lmdb-safe/lmdb-safe.cc index be3ef4561c..083d0661b3 100644 --- a/ext/lmdb-safe/lmdb-safe.cc +++ b/ext/lmdb-safe/lmdb-safe.cc @@ -42,7 +42,9 @@ namespace LMDBLS { size_t headersize = LS_MIN_HEADER_SIZE; - headersize += ntohs(lsh->d_numextra) * LS_BLOCK_SIZE; + uint16_t numextra = (val[LS_NUMEXTRA_OFFSET] << 8) + val[LS_NUMEXTRA_OFFSET+1]; + + headersize += numextra * LS_BLOCK_SIZE; if (val.size() < headersize) { throw std::runtime_error("LSheader too short for promised extra data"); diff --git a/ext/lmdb-safe/lmdb-safe.hh b/ext/lmdb-safe/lmdb-safe.hh index f9ce08ab41..9097d647f3 100644 --- a/ext/lmdb-safe/lmdb-safe.hh +++ b/ext/lmdb-safe/lmdb-safe.hh @@ -142,8 +142,9 @@ namespace LMDBLS { static_assert(sizeof(LSheader)==24, "LSheader size is wrong"); - const size_t LS_MIN_HEADER_SIZE=sizeof(LSheader); // FIXME: rename this so all code that relies on it breaks - it needs to use LScheckHeaderAndGetSize below - const size_t LS_BLOCK_SIZE=8; + const size_t LS_MIN_HEADER_SIZE = sizeof(LSheader); + const size_t LS_BLOCK_SIZE = 8; + const size_t LS_NUMEXTRA_OFFSET = 22; const uint8_t LS_FLAG_DELETED = 0x01; LSheader* LSassertFixedHeaderSize(std::string_view val); -- 2.47.2