From: Peter van Dijk Date: Fri, 17 Mar 2023 10:57:26 +0000 (+0100) Subject: avoid one unaligned uint16_t access X-Git-Tag: auth-4.8.0-alpha1~1^2~11 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=38af8ac849d63e88ea5d862444e94165e9fb8218;p=thirdparty%2Fpdns.git avoid one unaligned uint16_t access --- 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);