]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#2830] fixed UB caused by unalligned read
authorRazvan Becheriu <razvan@isc.org>
Thu, 8 Jun 2023 17:02:30 +0000 (20:02 +0300)
committerRazvan Becheriu <razvan@isc.org>
Wed, 21 Jun 2023 12:06:06 +0000 (15:06 +0300)
src/lib/eval/tests/token_unittest.cc
src/lib/eval/token.cc

index c18665840a4bf525ce9ae828ca70bec8ac267568..a913cb56dcce2f3f1f199db32168c2f796854096 100644 (file)
@@ -896,14 +896,18 @@ TEST_F(TokenTest, integerToText) {
     // Check that the evaluation put its value on the values stack.
     ASSERT_EQ(1, values_.size());
 
-    values_.push(std::string(const_cast<const char *>(reinterpret_cast<char*>(&data)), sizeof(int16_t)));
+    int16_t i16 = 0;
+    memcpy(&i16, &data, sizeof(int16_t));
+    values_.push(std::string(const_cast<const char *>(reinterpret_cast<char*>(&i16)), sizeof(int16_t)));
 
     EXPECT_NO_THROW(int16token->evaluate(*pkt4_, values_));
 
     // Check that the evaluation put its value on the values stack.
     ASSERT_EQ(2, values_.size());
 
-    values_.push(std::string(const_cast<const char *>(reinterpret_cast<char*>(&data)), sizeof(int32_t)));
+    int32_t i32 = 0;
+    memcpy(&i32, &data, sizeof(int32_t));
+    values_.push(std::string(const_cast<const char *>(reinterpret_cast<char*>(&i32)), sizeof(int32_t)));
 
     EXPECT_NO_THROW(int32token->evaluate(*pkt4_, values_));
 
@@ -917,14 +921,18 @@ TEST_F(TokenTest, integerToText) {
     // Check that the evaluation put its value on the values stack.
     ASSERT_EQ(4, values_.size());
 
-    values_.push(std::string(const_cast<const char *>(reinterpret_cast<char*>(&data)), sizeof(uint16_t)));
+    uint16_t ui16 = 0;
+    memcpy(&ui16, &data, sizeof(uint16_t));
+    values_.push(std::string(const_cast<const char *>(reinterpret_cast<char*>(&ui16)), sizeof(uint16_t)));
 
     EXPECT_NO_THROW(uint16token->evaluate(*pkt4_, values_));
 
     // Check that the evaluation put its value on the values stack.
     ASSERT_EQ(5, values_.size());
 
-    values_.push(std::string(const_cast<const char *>(reinterpret_cast<char*>(&data)), sizeof(uint32_t)));
+    uint32_t ui32 = 0;
+    memcpy(&ui32, &data, sizeof(uint32_t));
+    values_.push(std::string(const_cast<const char *>(reinterpret_cast<char*>(&ui32)), sizeof(uint32_t)));
 
     EXPECT_NO_THROW(uint32token->evaluate(*pkt4_, values_));
 
index 34993d7ddb894da38e53e563bb2130c943a05b36..16b1d227761625c07129970ac4b760688b7b05af 100644 (file)
@@ -191,9 +191,9 @@ TokenInt16ToText::evaluate(Pkt& /*pkt*/, ValueStack& values) {
     }
 
     stringstream tmp;
-    uint16_t value = *(reinterpret_cast<uint16_t*>(const_cast<char*>(op.data())));
-    std::string data = EvalContext::fromUint16(value);
-    tmp << *(reinterpret_cast<int16_t*>(const_cast<char*>(data.data())));
+    int16_t value = 0;
+    memcpy(&value, op.data(), size);
+    tmp << value;
     op = tmp.str();
     values.push(op);
 
@@ -222,9 +222,9 @@ TokenInt32ToText::evaluate(Pkt& /*pkt*/, ValueStack& values) {
     }
 
     stringstream tmp;
-    uint32_t value = *(reinterpret_cast<uint32_t*>(const_cast<char*>(op.data())));
-    std::string data = EvalContext::fromUint32(value);
-    tmp << *(reinterpret_cast<int32_t*>(const_cast<char*>(data.data())));
+    int32_t value = 0;
+    memcpy(&value, op.data(), size);
+    tmp << value;
     op = tmp.str();
     values.push(op);
 
@@ -282,9 +282,9 @@ TokenUInt16ToText::evaluate(Pkt& /*pkt*/, ValueStack& values) {
     }
 
     stringstream tmp;
-    uint16_t value = *(reinterpret_cast<uint16_t*>(const_cast<char*>(op.data())));
-    std::string data = EvalContext::fromUint16(value);
-    tmp << *(reinterpret_cast<uint16_t*>(const_cast<char*>(data.data())));
+    uint16_t value = 0;
+    memcpy(&value, op.data(), size);
+    tmp << value;
     op = tmp.str();
     values.push(op);
 
@@ -313,9 +313,9 @@ TokenUInt32ToText::evaluate(Pkt& /*pkt*/, ValueStack& values) {
     }
 
     stringstream tmp;
-    uint32_t value = *(reinterpret_cast<uint32_t*>(const_cast<char*>(op.data())));
-    std::string data = EvalContext::fromUint32(value);
-    tmp << *(reinterpret_cast<uint32_t*>(const_cast<char*>(data.data())));
+    uint32_t value = 0;
+    memcpy(&value, op.data(), size);
+    tmp << value;
     op = tmp.str();
     values.push(op);