]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
lmdbbackend: avoid unaligned uint32_t reads by using memcpy
authorPeter van Dijk <peter.van.dijk@powerdns.com>
Wed, 6 Jan 2021 16:17:00 +0000 (17:17 +0100)
committerPeter van Dijk <peter.van.dijk@powerdns.com>
Mon, 11 Jan 2021 15:41:57 +0000 (16:41 +0100)
lmdbbackend.cc:942:27: runtime error: load of misaligned address 0x604000b827aa for type 'uint32_t' (aka 'unsigned int'), which requires 4 byte alignment

(cherry picked from commit f061d15d3289070750d7213c04cbd93fe6c5ec5c+d49406608a9d35144bd01de18f78989c3739d155)

modules/lmdbbackend/lmdbbackend.cc

index 2497eb63e1327258c2e5ccbb4e48af63113cc23f..e155ce6a4cb5a2a894186f941fdd829a483c99bb 100644 (file)
@@ -833,7 +833,10 @@ bool LMDBBackend::getDomainInfo(const DNSName &domain, DomainInfo &di, bool getS
       serFromString(val.get<string_view>(), rr);
 
       if(rr.content.size() >= 5 * sizeof(uint32_t)) {
-        uint32_t serial = *reinterpret_cast<uint32_t*>(&rr.content[rr.content.size() - (5 * sizeof(uint32_t))]);
+        uint32_t serial;
+        // a SOA has five 32 bit fields, the first of which is the serial
+        // there are two variable length names before the serial, so we calculate from the back
+        memcpy(&serial, &rr.content[rr.content.size() - (5 * sizeof(uint32_t))], sizeof(serial));
         di.serial = ntohl(serial);
       }
     }
@@ -948,7 +951,10 @@ void LMDBBackend::getAllDomains(vector<DomainInfo> *domains, bool include_disabl
       serFromString(val.get<string_view>(), rr);
 
       if(rr.content.size() >= 5 * sizeof(uint32_t)) {
-        uint32_t serial = *reinterpret_cast<uint32_t*>(&rr.content[rr.content.size() - (5 * sizeof(uint32_t))]);
+        uint32_t serial;
+        // a SOA has five 32 bit fields, the first of which is the serial
+        // there are two variable length names before the serial, so we calculate from the back
+        memcpy(&serial, &rr.content[rr.content.size() - (5 * sizeof(uint32_t))], sizeof(serial));
         di.serial = ntohl(serial);
       }
     } else if(!include_disabled) {