]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
avoid one unaligned uint16_t access
authorPeter van Dijk <peter.van.dijk@powerdns.com>
Fri, 17 Mar 2023 10:57:26 +0000 (11:57 +0100)
committerPeter van Dijk <peter.van.dijk@powerdns.com>
Fri, 17 Mar 2023 10:57:26 +0000 (11:57 +0100)
ext/lmdb-safe/lmdb-safe.cc
ext/lmdb-safe/lmdb-safe.hh

index be3ef4561cbcf7357685946a66d0ed3deac9dc8a..083d0661b317a8b0a841c71e487c0b4f748836dc 100644 (file)
@@ -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");
index f9ce08ab41f711f6252ed59f7ada3ac8695bf150..9097d647f3ae4dc5ca2611bb28209eac336f2d8a 100644 (file)
@@ -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);