Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions include/fastcdr/Cdr.h
Original file line number Diff line number Diff line change
Expand Up @@ -2731,11 +2731,16 @@ class Cdr
{
deserialize(member_value);
}
if (current_state.member_size_ != offset_ - prev_offset)
size_t member_size {current_state.member_size_};
size_t diff {offset_ - prev_offset};
if (member_size < diff)
{
throw exception::BadParamException(
"Member size provided by member header is not equal to the real decoded member size");
"Member size provided by member header is lower than real decoded member size");
}

// Skip unused bytes
offset_ += (member_size - diff);
}
else
{
Expand Down
54 changes: 54 additions & 0 deletions test/xcdr/xcdrv1.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -460,3 +460,57 @@ INSTANTIATE_TEST_SUITE_P(
Cdr::XCdrHeaderSelection::AUTO_WITH_SHORT_HEADER_BY_DEFAULT,
Cdr::XCdrHeaderSelection::AUTO_WITH_LONG_HEADER_BY_DEFAULT
));

/*!
* @test Regression test for optional string with extra alignment sent by RTI (#23838)
* @code{.idl}
* struct OptinalStringWithExtraAlignment
* {
* @optional string<100> str;
* unsigned short value;
* };
* @endcode
*/
TEST(XCdrTest, optional_string_with_extra_alignment)
{
std::array<char, 18> fail_case_buffer {
0x00, 0x01, 0x00, 0x00, // Encapsulation
0x00, 0x00, 0x08, 0x00, // ShortMemberHeader
0x03, 0x00, 0x00, 0x00, // String length
0x41, 0x42, 0x00, // String
0x00, // Extra alignment byte
0x30, 0x00 // Short
};

EncodingAlgorithmFlag encoding = EncodingAlgorithmFlag::PLAIN_CDR;
Cdr::Endianness endianness = Cdr::Endianness::LITTLE_ENDIANNESS;
FastBuffer fast_buffer(fail_case_buffer.data(), fail_case_buffer.size());
Cdr cdr(fast_buffer, endianness, CdrVersion::XCDRv1);
cdr.read_encapsulation();
ASSERT_EQ(cdr.get_encoding_flag(), encoding);
ASSERT_EQ(cdr.endianness(), endianness);

optional<fixed_string<100>> dvalue;
uint16_t short_dvalue {0};
cdr.deserialize_type(encoding, [&](Cdr& cdr_inner, const MemberId& mid)->bool
{
bool ret_value = true;

switch (mid.id)
{
case 0:
cdr_inner >> dvalue;
break;
case 1:
cdr_inner >> short_dvalue;
break;
default:
ret_value = false;
}

return ret_value;
});
ASSERT_TRUE(dvalue.has_value());
ASSERT_STREQ("AB", dvalue.value());
ASSERT_EQ(0x30, short_dvalue);
}