From 9599051bc7dbf9a3483cb20891c76acebbcd8691 Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Thu, 1 Dec 2022 19:35:53 +0100 Subject: [PATCH] DRAFT: [C++] C Data Interface: check imported buffer for non-null Followup to https://github.com/apache/arrow/issues/14805 --- cpp/src/arrow/c/bridge.cc | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/cpp/src/arrow/c/bridge.cc b/cpp/src/arrow/c/bridge.cc index 002096399d261..2cbef53226a69 100644 --- a/cpp/src/arrow/c/bridge.cc +++ b/cpp/src/arrow/c/bridge.cc @@ -1528,7 +1528,7 @@ struct ArrayImporter { } Status ImportNullBitmap(int32_t buffer_id = 0) { - RETURN_NOT_OK(ImportBitsBuffer(buffer_id)); + RETURN_NOT_OK(ImportBitsBuffer(buffer_id, /*is_null_bitmap=*/true)); if (data_->null_count > 0 && data_->buffers[buffer_id] == nullptr) { return Status::Invalid( "ArrowArray struct has null bitmap buffer but non-zero null_count ", @@ -1537,10 +1537,10 @@ struct ArrayImporter { return Status::OK(); } - Status ImportBitsBuffer(int32_t buffer_id) { + Status ImportBitsBuffer(int32_t buffer_id, bool is_null_bitmap = false) { // Compute visible size of buffer int64_t buffer_size = bit_util::BytesForBits(c_struct_->length + c_struct_->offset); - return ImportBuffer(buffer_id, buffer_size); + return ImportBuffer(buffer_id, buffer_size, is_null_bitmap); } Status ImportFixedSizeBuffer(int32_t buffer_id, int64_t byte_width) { @@ -1566,13 +1566,19 @@ struct ArrayImporter { return ImportBuffer(buffer_id, buffer_size); } - Status ImportBuffer(int32_t buffer_id, int64_t buffer_size) { + Status ImportBuffer(int32_t buffer_id, int64_t buffer_size, + bool is_null_bitmap = false) { std::shared_ptr* out = &data_->buffers[buffer_id]; auto data = reinterpret_cast(c_struct_->buffers[buffer_id]); if (data != nullptr) { *out = std::make_shared(data, buffer_size, import_); } else { out->reset(); + if (!is_null_bitmap && buffer_size != 0) { + return Status::Invalid( + "ArrowArrayStruct contains null data pointer " + "for a buffer with non-zero computed size"); + } } return Status::OK(); }