Skip to content

Commit 474dc3e

Browse files
committed
reject null variadic buffers on export
1 parent fdc35be commit 474dc3e

2 files changed

Lines changed: 13 additions & 11 deletions

File tree

cpp/src/arrow/c/bridge.cc

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -608,8 +608,12 @@ struct ArrayExporter {
608608
export_.variadic_buffer_sizes_.resize(variadic_buffers.size());
609609
size_t i = 0;
610610
for (const auto& buf : variadic_buffers) {
611-
// The C Data Interface allows null variadic buffer pointers with size 0.
612-
export_.variadic_buffer_sizes_[i++] = buf == nullptr ? 0 : buf->size();
611+
if (buf == nullptr) {
612+
return Status::Invalid("Cannot export array of type ", data->type->ToString(),
613+
": null variadic buffer at buffer index #", i + 2,
614+
" (variadic buffer index #", i, ")");
615+
}
616+
export_.variadic_buffer_sizes_[i++] = buf->size();
613617
}
614618
export_.buffers_.back() = export_.variadic_buffer_sizes_.data();
615619
}

cpp/src/arrow/c/bridge_test.cc

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -930,7 +930,7 @@ TEST_F(TestArrayExport, PrimitiveSliced) {
930930
TestPrimitive(factory);
931931
}
932932

933-
TEST_F(TestArrayExport, NullVariadicBuffers) {
933+
TEST_F(TestArrayExport, RejectNullVariadicBuffers) {
934934
// GH-49740: _export_to_c segmentation fault for binary_view array.
935935
for (const auto& type : {binary_view(), utf8_view()}) {
936936
auto arr =
@@ -943,14 +943,12 @@ TEST_F(TestArrayExport, NullVariadicBuffers) {
943943
nullptr}));
944944

945945
struct ArrowArray c_export;
946-
ASSERT_OK(ExportArray(*arr, &c_export));
947-
ArrayExportGuard guard(&c_export);
948-
949-
ASSERT_EQ(c_export.n_buffers, 4);
950-
ASSERT_EQ(c_export.buffers[2], nullptr);
951-
ASSERT_NE(c_export.buffers[3], nullptr);
952-
const auto* variadic_buffer_sizes = static_cast<const int64_t*>(c_export.buffers[3]);
953-
ASSERT_EQ(variadic_buffer_sizes[0], 0);
946+
EXPECT_RAISES_WITH_MESSAGE_THAT(
947+
Invalid,
948+
::testing::HasSubstr(
949+
"Cannot export array of type " + type->ToString() +
950+
": null variadic buffer at buffer index #2 (variadic buffer index #0)"),
951+
ExportArray(*arr, &c_export));
954952
}
955953
}
956954

0 commit comments

Comments
 (0)