Skip to content

Commit bf2a3fe

Browse files
committed
DCS: Fix undefined behavior and invalid pointer access
1 parent a1b356b commit bf2a3fe

File tree

1 file changed

+12
-11
lines changed

1 file changed

+12
-11
lines changed

Detectors/DCS/src/DataPointCreator.cxx

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,9 @@ DataPointCompositeObject createDataPointCompositeObject(const std::string& alias
3737
template <>
3838
DataPointCompositeObject createDataPointCompositeObject(const std::string& alias, float val, uint32_t seconds, uint16_t msec, uint16_t flags)
3939
{
40-
float tmp[2];
41-
tmp[0] = val;
42-
tmp[1] = 0;
43-
return createDPCOM(alias, reinterpret_cast<const uint64_t*>(&tmp[0]), seconds, msec, flags, DeliveryType::DPVAL_FLOAT);
40+
uint64_t tmp = 0;
41+
memcpy(&tmp, &val, sizeof(val));
42+
return createDPCOM(alias, &tmp, seconds, msec, flags, DeliveryType::DPVAL_FLOAT);
4443
}
4544

4645
template <>
@@ -54,36 +53,38 @@ template <>
5453
DataPointCompositeObject createDataPointCompositeObject(const std::string& alias, uint32_t val, uint32_t seconds, uint16_t msec, uint16_t flags)
5554
{
5655
uint64_t tmp{val};
57-
return createDPCOM(alias, reinterpret_cast<const uint64_t*>(&tmp), seconds, msec, flags, DeliveryType::DPVAL_UINT);
56+
return createDPCOM(alias, &tmp, seconds, msec, flags, DeliveryType::DPVAL_UINT);
5857
}
5958

6059
template <>
6160
DataPointCompositeObject createDataPointCompositeObject(const std::string& alias, long long val, uint32_t seconds, uint16_t msec, uint16_t flags)
6261
{
6362
uint64_t tmp{static_cast<uint64_t>(val)};
64-
return createDPCOM(alias, reinterpret_cast<const uint64_t*>(&tmp), seconds, msec, flags, DeliveryType::DPVAL_UINT);
63+
return createDPCOM(alias, &tmp, seconds, msec, flags, DeliveryType::DPVAL_UINT);
6564
}
6665

6766
template <>
6867
DataPointCompositeObject createDataPointCompositeObject(const std::string& alias, char val, uint32_t seconds, uint16_t msec, uint16_t flags)
6968
{
70-
return createDPCOM(alias, reinterpret_cast<const uint64_t*>(&val), seconds, msec, flags, DeliveryType::DPVAL_CHAR);
69+
uint64_t tmp = 0;
70+
memcpy(&tmp, &val, 1);
71+
return createDPCOM(alias, &tmp, seconds, msec, flags, DeliveryType::DPVAL_CHAR);
7172
}
7273

7374
template <>
7475
DataPointCompositeObject createDataPointCompositeObject(const std::string& alias, bool val, uint32_t seconds, uint16_t msec, uint16_t flags)
7576
{
7677
uint64_t tmp{val};
77-
return createDPCOM(alias, reinterpret_cast<const uint64_t*>(&tmp), seconds, msec, flags, DeliveryType::DPVAL_BOOL);
78+
return createDPCOM(alias, &tmp, seconds, msec, flags, DeliveryType::DPVAL_BOOL);
7879
}
7980

8081
template <>
8182
DataPointCompositeObject createDataPointCompositeObject(const std::string& alias, std::string val, uint32_t seconds, uint16_t msec, uint16_t flags)
8283
{
8384
constexpr int N{56};
84-
char str[N];
85-
strncpy(str, val.c_str(), N);
86-
return createDPCOM(alias, reinterpret_cast<const uint64_t*>(&str[0]), seconds, msec, flags, DeliveryType::DPVAL_STRING);
85+
uint64_t tmp[N / sizeof(uint64_t)];
86+
strncpy((char*)tmp, val.c_str(), N);
87+
return createDPCOM(alias, tmp, seconds, msec, flags, DeliveryType::DPVAL_STRING);
8788
}
8889

8990
} // namespace o2::dcs

0 commit comments

Comments
 (0)