Skip to content

Commit ab10bfa

Browse files
Reset string array size when allocation fails in init (ros2#593) (ros2#597)
(cherry picked from commit bf78574) Signed-off-by: leoca <leo.camus23@gmail.com> Co-authored-by: Leo Camus <leo.camus23@gmail.com>
1 parent 747ff24 commit ab10bfa

2 files changed

Lines changed: 13 additions & 0 deletions

File tree

‎src/string_array.c‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ rcutils_string_array_init(
5757
string_array->data = allocator->zero_allocate(size, sizeof(char *), allocator->state);
5858
if (NULL == string_array->data && 0 != size) {
5959
RCUTILS_SET_ERROR_MSG("failed to allocate string array");
60+
string_array->size = 0;
6061
return RCUTILS_RET_BAD_ALLOC;
6162
}
6263
string_array->allocator = *allocator;

‎test/test_string_array.cpp‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,18 @@ TEST(test_string_array, boot_string_array) {
7373
ASSERT_EQ(RCUTILS_RET_OK, rcutils_string_array_fini(&sa4));
7474
}
7575

76+
TEST(test_string_array, init_alloc_failure_leaves_array_empty) {
77+
auto failing_allocator = get_failing_allocator();
78+
79+
rcutils_string_array_t sa = rcutils_get_zero_initialized_string_array();
80+
EXPECT_EQ(RCUTILS_RET_BAD_ALLOC, rcutils_string_array_init(&sa, 3, &failing_allocator));
81+
rcutils_reset_error();
82+
// Nothing was allocated, so the array must not advertise entries that cannot be read.
83+
EXPECT_EQ(nullptr, sa.data);
84+
EXPECT_EQ(0u, sa.size);
85+
EXPECT_EQ(RCUTILS_RET_OK, rcutils_string_array_fini(&sa));
86+
}
87+
7688
TEST(test_string_array, string_array_cmp) {
7789
auto allocator = rcutils_get_default_allocator();
7890
rcutils_ret_t ret = RCUTILS_RET_OK;

0 commit comments

Comments
 (0)