Skip to content

Commit 4d23774

Browse files
committed
Fixed bug reported in "parseSignals should fail if frame data length is too small"
Fixes #29
1 parent e281cc8 commit 4d23774

File tree

2 files changed

+9
-1
lines changed

2 files changed

+9
-1
lines changed

include/libdbc/message.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ struct Message {
1919
ErrorBigEndian,
2020
ErrorUnknownID,
2121
ErrorInvalidConversion,
22+
ErrorInvalidSignalSize,
2223
};
2324

2425
ParseSignalsStatus parse_signals(const std::vector<uint8_t>& data, std::vector<double>& values) const;

src/message.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#include <arpa/inet.h>
2+
13
#include <cstddef>
24
#include <cstdint>
35
#include <libdbc/message.hpp>
@@ -35,15 +37,20 @@ Message::ParseSignalsStatus Message::parse_signals(const std::vector<uint8_t>& d
3537
uint64_t data_little_endian = 0;
3638
uint64_t data_big_endian = 0;
3739
for (std::size_t i = 0; i < size; i++) {
38-
data_little_endian |= ((uint64_t)data[i]) << i * ONE_BYTE;
3940
data_big_endian = (data_big_endian << ONE_BYTE) | (uint64_t)data[i];
4041
}
42+
data_little_endian = ntohl(data_little_endian);
4143

4244
// TODO: does this also work on a big endian machine?
4345

4446
const auto len = size * 8;
4547
uint64_t value = 0;
4648
for (const auto& signal : m_signals) {
49+
50+
if (signal.size > len) {
51+
return ParseSignalsStatus::ErrorInvalidSignalSize;
52+
}
53+
4754
if (signal.is_bigendian) {
4855
uint32_t start_bit = ONE_BYTE * (signal.start_bit / ONE_BYTE) + (SEVEN_BITS - (signal.start_bit % ONE_BYTE)); // Calculation taken from python CAN
4956
value = data_big_endian << start_bit;

0 commit comments

Comments
 (0)