| 242 | } |
| 243 | |
| 244 | bool 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 |
nothing calls this directly
no outgoing calls
no test coverage detected