Skip to content

Commit d3216ea

Browse files
fix: ub in SerializeIntoBuffer
1 parent 8d75159 commit d3216ea

File tree

1 file changed

+20
-13
lines changed

1 file changed

+20
-13
lines changed

data_tamer_cpp/include/data_tamer/contrib/SerializeMe.hpp

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,13 @@ size_t BufferSize(const T& val);
100100
template <>
101101
size_t BufferSize(const std::string& str);
102102

103-
template <class T, size_t N, std::enable_if_t<!has_TypeDefinition<std::array<T, N>>::value, bool> = true>
103+
template <class T, size_t N,
104+
std::enable_if_t<!has_TypeDefinition<std::array<T, N>>::value, bool> = true>
104105
size_t BufferSize(const std::array<T, N>& v);
105106

106-
template <template <class, class> class Container, class T, class... TArgs,
107-
std::enable_if_t<!has_TypeDefinition<Container<T, TArgs...>>::value, bool> = true>
107+
template <
108+
template <class, class> class Container, class T, class... TArgs,
109+
std::enable_if_t<!has_TypeDefinition<Container<T, TArgs...>>::value, bool> = true>
108110
size_t BufferSize(const Container<T, TArgs...>& vect);
109111

110112
//---------- Forward declarations of DeserializeFromBuffer -----------
@@ -115,11 +117,13 @@ void DeserializeFromBuffer(SpanBytesConst& buffer, T& dest);
115117
template <>
116118
void DeserializeFromBuffer(SpanBytesConst& buffer, std::string& str);
117119

118-
template <class T, size_t N, std::enable_if_t<!has_TypeDefinition<std::array<T, N>>::value, bool> = true>
120+
template <class T, size_t N,
121+
std::enable_if_t<!has_TypeDefinition<std::array<T, N>>::value, bool> = true>
119122
void DeserializeFromBuffer(SpanBytesConst& buffer, std::array<T, N>& v);
120123

121-
template <template <class, class> class Container, class T, class... TArgs,
122-
std::enable_if_t<!has_TypeDefinition<Container<T, TArgs...>>::value, bool> = true>
124+
template <
125+
template <class, class> class Container, class T, class... TArgs,
126+
std::enable_if_t<!has_TypeDefinition<Container<T, TArgs...>>::value, bool> = true>
123127
void DeserializeFromBuffer(SpanBytesConst& buffer, Container<T, TArgs...>& dest);
124128

125129
//---------- Forward declarations of SerializeIntoBuffer -----------
@@ -130,11 +134,13 @@ void SerializeIntoBuffer(SpanBytes& buffer, const T& value);
130134
template <>
131135
void SerializeIntoBuffer(SpanBytes& buffer, const std::string& str);
132136

133-
template <class T, size_t N, std::enable_if_t<!has_TypeDefinition<std::array<T, N>>::value, bool> = true>
137+
template <class T, size_t N,
138+
std::enable_if_t<!has_TypeDefinition<std::array<T, N>>::value, bool> = true>
134139
void SerializeIntoBuffer(SpanBytes& buffer, const std::array<T, N>& v);
135140

136-
template <template <class, class> class Container, class T, class... TArgs,
137-
std::enable_if_t<!has_TypeDefinition<Container<T, TArgs...>>::value, bool> = true>
141+
template <
142+
template <class, class> class Container, class T, class... TArgs,
143+
std::enable_if_t<!has_TypeDefinition<Container<T, TArgs...>>::value, bool> = true>
138144
void SerializeIntoBuffer(SpanBytes& buffer, const Container<T, TArgs...>& vect);
139145

140146
//-----------------------------------------------------------------------
@@ -177,8 +183,8 @@ inline void Span<T>::trimFront(size_t offset)
177183
#endif // __s390x__
178184
#if !defined(SERIALIZE_LITTLEENDIAN)
179185
#if defined(__GNUC__) || defined(__clang__) || defined(__ICCARM__)
180-
#if(defined(__BIG_ENDIAN__) || \
181-
(defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__))
186+
#if (defined(__BIG_ENDIAN__) || \
187+
(defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__))
182188
#define SERIALIZE_LITTLEENDIAN 0
183189
#else
184190
#define SERIALIZE_LITTLEENDIAN 1
@@ -494,9 +500,10 @@ inline void SerializeIntoBuffer(SpanBytes& buffer, T const& value)
494500
throw std::runtime_error("SerializeIntoBuffer: buffer overflow");
495501
}
496502
#if SERIALIZE_LITTLEENDIAN == 0
497-
*(reinterpret_cast<T*>(buffer.data())) = EndianSwap<T>(value);
503+
T swapped = EndianSwap<T>(value);
504+
std::memcpy(buffer.data(), &swapped, S);
498505
#else
499-
*(reinterpret_cast<T*>(buffer.data())) = value;
506+
std::memcpy(buffer.data(), &value, S);
500507
#endif
501508
buffer.trimFront(S); // NOLINT
502509
}

0 commit comments

Comments
 (0)