MCPcopy Create free account
hub / github.com/COVESA/vsomeip / check_lengths

Method check_lengths

implementation/endpoints/src/tp_message.cpp:244–283  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

242}
243
244bool tp_message::check_lengths(const byte_t* const _data, std::uint32_t _data_length, length_t _segment_size, bool _more_fragments) {
245
246 const length_t its_length = bithelper::read_uint32_be(&_data[VSOMEIP_LENGTH_POS_MIN]);
247 const tp_header_t its_tp_header = bithelper::read_uint32_be(&_data[VSOMEIP_TP_HEADER_POS_MIN]);
248 bool ret(true);
249
250 if (!tp::tp_flag_is_set(_data[VSOMEIP_MESSAGE_TYPE_POS])) {
251 VSOMEIP_ERROR_P << "TP flag not set " << get_message_id(_data, _data_length);
252 ret = false;
253 } else if (_data_length != its_length + VSOMEIP_SOMEIP_HEADER_SIZE) {
254 VSOMEIP_ERROR_P << "Data length doesn't match header length field" << get_message_id(_data, _data_length)
255 << " data: " << _data_length << " header: " << its_length;
256 ret = false;
257 } else if (_segment_size != its_length - VSOMEIP_TP_HEADER_SIZE - (VSOMEIP_FULL_HEADER_SIZE - VSOMEIP_SOMEIP_HEADER_SIZE)) {
258 VSOMEIP_ERROR_P << "Segment size doesn't align with header length field" << get_message_id(_data, _data_length)
259 << "segment size: " << _segment_size << " data: " << _data_length << " header: " << its_length;
260 ret = false;
261 } else if (_segment_size > tp::tp_max_segment_length_) {
262 VSOMEIP_ERROR_P << "Segment exceeds allowed size " << get_message_id(_data, _data_length) << "segment size: " << _segment_size
263 << " (max. " << tp::tp_max_segment_length_ << ") data: " << _data_length << " header: " << its_length;
264 ret = false;
265 } else if (_more_fragments && _segment_size % 16 > 0) {
266 VSOMEIP_ERROR_P << "Segment size not multiple of 16 " << get_message_id(_data, _data_length) << "segment size: " << _segment_size
267 << " data: " << _data_length << " header: " << its_length;
268 ret = false;
269 } else if (current_message_size_ + _segment_size > max_message_size_
270 || current_message_size_ + _segment_size < _segment_size) { // overflow check
271 VSOMEIP_ERROR_P << "Message exceeds maximum configured size: " << get_message_id(_data, _data_length)
272 << "segment size: " << _segment_size << " current message size: " << current_message_size_
273 << " maximum message size: " << max_message_size_;
274 ret = false;
275 } else if (tp::get_offset(its_tp_header) + _segment_size > max_message_size_
276 || tp::get_offset(its_tp_header) + _segment_size < _segment_size) { // overflow check
277 VSOMEIP_ERROR_P << "SomeIP/TP offset field exceeds maximum configured message size: " << get_message_id(_data, _data_length)
278 << " TP offset [bytes]: " << tp::get_offset(its_tp_header) << " segment size: " << _segment_size
279 << " current message size: " << current_message_size_ << " maximum message size: " << max_message_size_;
280 ret = false;
281 }
282 return ret;
283}
284
285} // namespace tp
286} // namespace vsomeip_v3

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected